2017-05-30 5 views
2

PHPを使用してRSSフィードを読み込もうとしています。何らかの理由で、このコンテンツタグを読み取ることができません。RSSフィードを読むことができません<a10:content type = "text/xml">タグ

<a10:content type="text/xml">...</a10:content> 

これは、アイテムがここに私のコードがある

<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom"> 
    <channel> 
     <title>mMin title</title> 
     <description>Some description</description> 
     <managingEditor>[email protected]</managingEditor> 
     <category>Some category</category> 
     <item> 
      <guid isPermaLink="false">1</guid> 
      <link>https://example.com/1</link> 
      <title>Some title 1</title> 
      <a10:updated>2017-05-30T13:20:22+02:00</a10:updated> 
      <a10:content type="text/xml"> 
       <Location>San diego</Location> 
       <PublishedOn>2016-10-21T11:21:07</PublishedOn> 
       <Body>Lorem ipsum dolar</Body> 
       <JobCountry>USA</JobCountry> 
      </a10:content> 
     </item> 
     <item> 
      <guid isPermaLink="false">1</guid> 
      <link>https://example.com/2</link> 
      <title>Some title 2</title> 
      <a10:updated>2017-05-30T13:20:22+02:00</a10:updated> 
      <a10:content type="text/xml"> 
       <Location>Detroit</Location> 
       <PublishedOn>2016-10-21T11:21:07</PublishedOn> 
       <Body>Lorem ipsum dolar</Body> 
       <JobCountry>USA</JobCountry> 
      </a10:content> 
     </item> 
     <item> 
      <guid isPermaLink="false">1</guid> 
      <link>https://example.com/3</link> 
      <title>Some title 3</title> 
      <a10:updated>2017-05-30T13:20:22+02:00</a10:updated> 
      <a10:content type="text/xml"> 
       <Location>Los Angeles</Location> 
       <PublishedOn>2016-10-21T11:21:07</PublishedOn> 
       <Body>Lorem ipsum dolar</Body> 
       <JobCountry>USA</JobCountry> 
      </a10:content> 
     </item> 
    </channel> 
</rss> 

ように見えることができるものの一例です。ここで

SimpleXMLElement {#111 ▼ 
     +"guid": "1" 
     +"link": "https://example.com" 
     +"title": "Some title" 
    } 

を出力

$url = "http://example.com/RSSFeed"; 
    $xml = simplexml_load_file($url); 

    foreach ($xml->channel as $x) { 
     foreach ($x->item as $item) { 

      dd($item); 
     } 
    } 

は、誰もがこのためのソリューションを持っている私の予想出力

SimpleXMLElement {#111 ▼ 
    +"guid": "1" 
    +"link": "https://example.com" 
    +"title": "Some title" 
    +"content" { 
    0 => { 
     +"Location": "San Diego" 
     +"PublishedOn": "2016-10-21T11:21:07" 
     +"Body": "Lorem ipsum dolar" 
     +"JobCountry": "USA" 
    } 
    1 => { 
     +"Location": "Detroit" 
     +"PublishedOn": "2016-10-21T11:21:07" 
     +"Body": "Lorem ipsum dolar" 
     +"JobCountry": "USA" 
    } 
    2 => { 
     +"Location": "Los Angeles" 
     +"PublishedOn": "2016-10-21T11:21:07" 
     +"Body": "Lorem ipsum dolar" 
     +"JobCountry": "USA" 
    } 
    } 
} 

のですか?

+0

です完全なXML? –

+0

@SahilGulati XMLを更新しました –

答えて

1

アクセスには名前空間を使用する必要があります。ここでは、希望の出力を達成するためにDOMDocumentを使用しています。 DOMDocument機能getElementsByTagNameNS、これにはnamespace uriと必要な内容を渡します。期待される出力を達成することができる。

simplexml_load_stringを使用する場合は、これを確認できます。 PHP code demo

Try this code snippet here

<?php 

ini_set('display_errors', 1); 

libxml_use_internal_errors(true); 
$string=<<<HTML 
<rss version="2.0" xmlns:a10="http://www.w3.org/2005/Atom"> 
    <channel> 
     <title>mMin title</title> 
     <description>Some description</description> 
     <managingEditor>[email protected]</managingEditor> 
     <category>Some category</category> 
     <item> 
      <guid isPermaLink="false">1</guid> 
      <link>https://example.com</link> 
      <title>Some title</title> 
      <a10:updated>2017-05-30T13:20:22+02:00</a10:updated> 
      <a10:content type="text/xml"> 
       <Location>Detroit</Location> 
       <PublishedOn>2016-10-21T11:21:07</PublishedOn> 
       <Body>Lorem ipsum dolar</Body> 
       <JobCountry>USA</JobCountry> 
      </a10:content> 
     </item> 
    </channel> 
</rss> 
HTML; 
$data=array(); 
$completeData=array(); 
$domDocument = new DOMDocument(); 
$domDocument->loadXML($string); 
$results=$domDocument->getElementsByTagNameNS("http://www.w3.org/2005/Atom", "content"); 
foreach($results as $result) 
{ 
    if($result instanceof DOMElement && $result->tagName=="a10:content") 
    { 
     foreach($result->childNodes as $node) 
     { 
      if($node instanceof DOMElement) 
      { 
       $data[]=$node->nodeValue; 
      } 
     } 
    } 
    $completeData[]=$data; 
} 
print_r($completeData); 
+1

あなたの問題が何であるかを説明しない限り、良い答えです。私はここでそれを – delboy1978uk

+0

は、私はいくつかの項目ではないキーと値のペアを持つ配列としてそれを必要とするということです。 –

+0

@SahilGulati問題を説明しています確かにdelboy1978uk @ –

0

まず、簡単なXMLを使用していない、それはがらくたです!あなたはDOMDocumentを使う方がはるかに優れています。 ytouにこれをgvieます

http://php.net/manual/en/class.domdocument.php

<?php 

$dom = new DOMDocument(); 
$dom->loadXML($xml); 


$items = $dom->getElementsByTagName('item'); 
$array = array(); 

foreach($items as $item) 
{ 
    $title = $item->getElementsByTagName('title')->item(0)->nodeValue; 
    $link = $item->getElementsByTagName('link')->item(0)->nodeValue; 
    $updated = $item->getElementsByTagName('updated')->item(0)->nodeValue; 
    $location = $item->getElementsByTagName('Location')->item(0)->nodeValue; 
    $pub = $item->getElementsByTagName('PublishedOn')->item(0)->nodeValue; 
    $body = $item->getElementsByTagName('Body')->item(0)->nodeValue; 
    $job = $item->getElementsByTagName('JobCountry')->item(0)->nodeValue; 

    $array[] = [ 
     'title' => $title, 
     'link' => $link, 
     'updated' => $updated, 
     'Location' => $location, 
     'PublishedOn' => $pub, 
     'Body' => $body, 
     'JobCountry' => $job, 
    ]; 
} 

var_dump($array); 

array(7) { ["title"]=> string(12) "Some title 1" ["link"]=> string(21) "https://example.com/1" ["updated"]=> string(25) "2017-05-30T13:20:22+02:00" ["Location"]=> string(9) "San diego" ["PublishedOn"]=> string(19) "2016-10-21T11:21:07" ["Body"]=> string(17) "Lorem ipsum dolar" ["JobCountry"]=> string(3) "USA" } 

こちらをご覧ください! https://3v4l.org/E0UXJ

今では動作しますが、便利な関数を作成することによって、それを最適化することができます:

function domToArray($item, array $cols) 
{ 
    $array = []; 
    foreach ($cols as $col) { 
     $val = $item->getElementsByTagName($col)->item(0)->nodeValue; 
     $array[$col] = $val; 
    } 
    return $array; 
} 

$dom = new DOMDocument(); 
$dom->loadXML($xml); 

$items = $dom->getElementsByTagName('item'); 
$array = array(); 

$fields = [ 
     'title', 
     'link', 
     'updated', 
     'Location', 
     'PublishedOn', 
     'Body', 
     'JobCountry', 
    ]; 

foreach($items as $item) 
{ 
    $array[] = domToArray($item, $fields); 
} 

var_dump($array); 

同じ出力、ここでここhttps://3v4l.org/W6HM3

+0

@ delboy1987ukいくつかの項目があり、それらを配列として必要とします。 –

+0

私はオブジェクトとしてすべてのアイテムを必要とします。すべてがフラットアレイではありません。 –

+0

更新中!待機する :-) – delboy1978uk

1

を見るには、私の作業溶液はあなたを共有することができ

$xml = file_get_contents("https://example.com/RSSFeed"); 

$string = str_replace(array("<a10:content","</a10:content>"), array("<content","</content>"), $xml); 

$sxe = new \SimpleXMLElement($string); 

$jobs = array(); 

foreach ($sxe as $item) { 

    dd($item); 

} 
関連する問題