2016-07-14 20 views
0

私のSquarespaceブログのRSSフィードにリンクされた私のウェブサイトに簡単な「ニュース」ウィジェットを作成したいと思います。特定のXMLノード属性を表示する方法は?

RSSフィードをここで見つけることができます:私は私のCURL関数からXMLデータをロードするとhttps://weboxsite.squarespace.com/?format=rss

、私は()私のXMLファイルをしますprint_rときのノードのいくつかを見ることができません。

特に、ノード属性を取得したいとします。<media>

私の<media>ノードの属性を取得するときは、url属性を取得できません。

私は簡単な読書のためにウェブからの結果を単純化しました。

<item> 
<title>Google Disque : un outil indispensable</title> 
<category>Google drive</category> 
<dc:creator></dc:creator> 
<pubDate>Wed, 22 Jun 2016 21:25:37 +0000</pubDate> 
<link> 
http://blogue.webox.site/touslesarticles/2016/6/22/google-disque-un-outil-indispensable 
</link> 
<guid isPermaLink="false"> 
5769a85b9de4bbf4535c1896:5769a8f1bebafb833a859939:576b01e48419c2d2589b7264 
</guid> 
<description> 
My excerpt.... 
</description> 
<content:encoded> 
<![CDATA[ 
<p>My content....</p> 
]]> 
</content:encoded> 
<media:content type="image/jpeg" url="http://static1.squarespace.com/static/5769a85b9de4bbf4535c1896/5769a8f1bebafb833a859939/576b01e48419c2d2589b7264/1466630737869/1500w/googledisque_bg.jpg" medium="image" isDefault="true" width="510" height="334"> 
<media:title type="plain">Google Disque : un outil indispensable</media:title> 
</media:content> 
</item> 

**主な問題は、**ここ

<media:content type="image/jpeg" url="http://static1.squarespace.com/static/5769a85b9de4bbf4535c1896/5769a8f1bebafb833a859939/576b01e48419c2d2589b7264/1466630737869/1500w/googledisque_bg.jpg" medium="image" isDefault="true" width="510" height="334"> 
    <media:title type="plain">Google Disque : un outil indispensable</media:title> 
    </media:content> 

は私のコードは

<?php 
$limit = 4; 

    $c=curl_init('https://weboxsite.squarespace.com/?format=rss'); 

    curl_setopt($c, CURLOPT_USERAGENT,'nesss'); 
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true); 
    $r=curl_exec($c); 
    curl_close($c); 

    $rss = new DOMDocument(); 
    $rss->loadxml($r); 

    $feed = array(); 

    foreach ($rss->getElementsByTagName('item') as $node) { 

     $item = array ( 
      'title'  => $node->getElementsByTagName('title')->item(0)->nodeValue, 
      'link'  => $node->getElementsByTagName('link')->item(0)->nodeValue, 
      'media'  => $node->getElementsByTagName('media')->item(0)->nodeValue, 
      'cat'  => $node->getElementsByTagName('category')->item(0)->nodeValue 
     ); 

     array_push($feed, $item); 
    } 

    for($x = 0; $x < $limit; $x++) { 

     $title = str_replace(' & ', ' &amp; ', $feed[$x]['title']); 
     $link = $feed[$x]['link']; 
     $desc = $feed[$x]['media']; 
     $cat = $feed[$x]['cat']; 

     echo '<p><strong><a href="'.$link.'" title="'.$title.'">'.$title.'</a></strong></p>'; 
     echo '<p>'.$cat.'</p>'; 

    } 

    ?> 

これまでのところで、私はこの'media' => $node->getElementsByTagName('media')->item(0)->nodeValueを行うことは、それを行うための良い方法ではないことを知っていますその値をレンダリングしようとするときに発生します。

私は'media'=> $node->getElementsByTagName('media')->item(0)->getAttribute('url')にしようとしましたが、エラーが発生しています。

Call to a member function getAttribute() on null in ... 

ノードはメディア:コンテンツだけではなく、この名前が変更されたイベントだと思うかもしれません。

どこかで見つからないものがありますか?

+0

お試しください - > [0] ' – JustOnUnderMillions

+0

私は自分の経験でできることすべてをほとんど試してみましたが、より具体的になりますか? –

+0

最後のコメントを忘れてしまった。 XMLの 'media'と' content'と 'dc'のNAMESPACESには問題があります。ここをクリックしてください:http://php.net/manual/en/domdocument.getelementsbytagnamens.php – JustOnUnderMillions

答えて

0

使用してみてください:ここで

​​

名前空間URIのファイルから:

のxmlns:コンテンツ= "http://purl.org/rss/1.0/modules/content/"

のxmlns:WFW = "http://wellformedweb.org/CommentAPI/"

のxmlns:iTunesの= "http://www.itunes.com/dtds/podcast-1.0.dtd"

xmlns:dc = "http://purl.org/dc/elements/1.1/"

xmlns:media = "http://www.rssboard。ORG /メディアRSS」

ので、最終的には:

'media' => $node->getElementsByTagName('content')->item(0)->nodeValue

は覚えておいてください

'media' => $node->getElementsByTagNameNS('http://www.rssboard.org/media-rss','content')->item(0)->getAttribute('url')

次のようになります。 "名前空間:NODENAME"、あなたはcontentないmediaを探していますので、

+0

あなたが私に与えた新しいコード行で、私はこれを持っています。 [0] =>配列 ( [タイトル] =>グーグルDISQUE:UN outil不可欠 [リンク] => http://blogue.webox.site/touslesarticles/2016/6/22/google-disque- メディアタイトル()の値を返すように見えます。 URL属性値ではなくGoogle Disque:不可欠な)を使用してください。 –

+0

これを変更しました。今はうまくいくはずです。 – JustOnUnderMillions

+0

それ以上のテストを少しして、ここではXMLの名前空間について説明しました。残りはあなたにあります。 – JustOnUnderMillions

0

media:の要素は、異なるXML名前空間にあります。あなたはMedia-RSSでなければならないRSSを読んでいるからです。属性xmlns:media="http://search.yahoo.com/mrss/"を探します。これは名前空間の定義です。パーサーは接頭辞を実際の名前空間に解決します。

  • media:content - >{http://search.yahoo.com/mrss/}content
  • media:title - >{http://search.yahoo.com/mrss/}title

要素が名前空間にあるので、あなたが名前空間を認識する方法を使用する必要があります。

$title = $node->getElementsByTagNameNS(
    'http://search.yahoo.com/mrss/', 'title' 
)->item(0)->nodeValue; 

それともをXpath式を使用し、独自のプレフィックスを登録します。

$rss = new DOMDocument(); 
$rss->loadxml($r); 
$xpath = new DOMXpath($rss); 
$xpath->registerNamespace('m', 'http://search.yahoo.com/mrss/'); 

$feed = array(); 
foreach ($xpath->evaluate('//item') as $node) { 
    $feed[] = array( 
     'title' => $xpath->evaluate('string(title)', $node), 
     'link' => $xpath->evaluate('string(link)', $node), 
     'media-title' => $xpath->evaluate('string(m:content/m:title)', $node), 
     'cat' => $xpath->evaluate('string(category)', $node) 
    ); 
} 
関連する問題