PHP&xml:xpath可以在结果中包含命名空间,而不仅仅是搜索吗?

PHP & XML: Can xpath include namespaces in the results, not just on the search?

我有一个包含名称空间的RSS源。我需要在结果中显示名称空间信息以及常规节点。我正在尝试xpath,但现在陷入困境,似乎找不到满足我需要的答案(或者至少是我理解的答案——他们可能在回答我的问题,但我不明白)。

这是我的RSS源(通过一些编辑来删除多余的节点):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<rss version="2.0" xmlns:media="http://search.yahoo.com/mrss/">
<channel>
   <item>
      ...
      <link>...</link>
      <description>...</description>
      ...</author>
      <pubDate>05/14/2008</pubDate>
         <media:content url="http://www.url.com">
            <media:title>...</media:title>
         </media:content>
   </item>
   <item>
      ...
      <link>...</link>
      <description>...</description>
      ...</author>
      <pubDate>06/17/2008</pubDate>
         <media:content url="http://www.url.com">
            <media:title>...</media:title>
         </media:content>
   </item>
</channel>

到目前为止,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
if (file_exists($filePath)) {
    $items = simplexml_load_file($filePath);
    $items->registerXPathNamespace("media","http://search.yahoo.com/mrss/");
    $items = $items->xpath('//item');
    usort($items,"toSort"); // sorts using an included function

    // output the file
    foreach($items as $item) {
        echo '';
        echo $item->content->attributes()->url;
        echo '' . $item->title . '';
        echo '<p>
'
. $item->description . '
</p>'
;
        echo '<p>
link . '
">read more &gt;&gt;
</p>';
        echo '';
        echo '&nbsp;';
    }
}

现在,正如我理解的那样,xpath将simplexml加载文件更改为数组类型,而且在大多数情况下,它还使搜索更容易/更快。问题是,当我使用xpath时,它会将媒体剥离:结果中的命名空间,而媒体结果是存储缩略图的位置,我需要在页面上显示图像。

我被卡住了,我不确定这是否是正确的道路了。有人能帮忙吗?


您需要使用SimpleXMLElement::children获取命名空间元素,它允许您传递命名空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
foreach($items as $item) {
    // media is an array with the media:* children of the item (ie media:content)
    $media = $item->children('http://search.yahoo.com/mrss/');
    echo '';
    echo $media[0]->attributes()->url; // media:content->attrinutes()->url
    echo '' . $item->title . '';
    echo '<p>
'
. $item->description . '
</p>'
;
    echo '<p>
link . '
">read more &gt;&gt;
</p>';
    echo '';
    echo '&nbsp;';
}