如何显示特定的XML节点属性?

时间:2016-07-14 15:54:48

标签: php xml rss domdocument

我想创建一个简单的"新闻"我的网站上的小部件链接到我的Squarespace博客的RSS源。

可以在此处找到RSS源:https://weboxsite.squarespace.com/?format=rss

当我从CURL函数加载XML数据时,在print_r()我的XML文件时,我无法看到一些节点。

最重要的是,我希望得到节点属性<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 ...

我可能认为这是因为节点被命名为media:content而不仅仅是媒体,但是事件发生了变化,它就没有了。

我在某处遗失了什么吗?

2 个答案:

答案 0 :(得分:0)

尝试使用:

getElementsByTagNameNS ( string $namespaceURI , string $localName )

这里是您文件中的namespaceURI:

的xmlns:含量=&#34; HTTP://purl.org/rss/1.0/modules/content/"

的xmlns:WFW =&#34; HTTP://wellformedweb.org/CommentAPI/"

的xmlns:iTunes的=&#34; HTTP://www.itunes.com/dtds/podcast-1.0.dtd"

的xmlns:DC =&#34; HTTP://purl.org/dc/elements/1.1/"

的xmlns:介质=&#34; HTTP://www.rssboard.org/media-rss"

最后:

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

变为

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

请记住:&#34; NAMESPACE:NODENAME&#34; ,所以您正在寻找content而不是media

希望有所帮助。

答案 1 :(得分:0)

var getStub = sinon.stub().yields(null, {error: "test error", error_description: "fake google error."}) sinon.stub(require("request"), 'get', stubCBForPromisify(getStub)) expect(getStub).to.have.been.calledOnce(); 的元素位于不同的XML命名空间中。因为您正在阅读应该是Media-RSS的RSS。查找属性media:。这是命名空间的定义。解析器将前缀解析为实际的命名空间。

  • xmlns:media="http://search.yahoo.com/mrss/" - &gt; media:content
  • {http://search.yahoo.com/mrss/}content - &gt; media:title

因为元素在命名空间中,所以您必须使用名称空间感知方法:

{http://search.yahoo.com/mrss/}title

或者您使用Xpath表达式并注册您自己的前缀。

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