我正在尝试使用 Xpath 解析一些 XML。如果没有找到现有前缀,我正在寻找的功能是以编程方式注册具有特定前缀的命名空间。
当我在 Xpath 查询中使用前缀时,我得到一个空数组,这表明 Xpath 是有效的,它只是没有返回任何结果。
这是我正在使用的 XML 示例。请注意,这是我实际代码的简化版本,它是为了说明我的问题。
$xml = <<<EOD
<rss version="2.0">
<channel>
<title> somdomain - RSS Video Feed</title>
<link>http://www.somdomain.com/</link>
<description>Latest Videos Released on somdomain</description>
<language>en-us</language>
<pubDate>Thu, 19 Sep 2013 16:53:29 GMT</pubDate>
<lastBuildDate>Thu, 19 Sep 2013 16:53:29 GMT</lastBuildDate>
<image>
<title>RSS Video Feed</title>
<url>
http://somdomain/cb/white.png
</url>
<link>http://www.somdomain.com/</link>
</image>
<link xmlns="http://www.w3.org/2005/Atom" href="http://www.somdomain.com/rss/" rel="self" type="application/rss+xml"/>
<item>
<title>The title </title>
<link>
http://www.somdomain.com/watch/8487128/
</link>
<description>
<IMG border="1" src="http://cdn1.image.somdomain.php/8.jpg" /> <BR/> Length: 07:08 <BR/> Keywords:
</description>
<pubDate>Thu, 19 Sep 2013 16:00:11 GMT</pubDate>
<guid>
http://www.somdomain.com/watch/
</guid>
</item>
</channel>
</rss>
EOD;
//default namespace
$d = "x";
$xml = new SimpleXMLElement($xml);
$ns = $xml->getNamespaces(true);
//there will only be one element here, $prefix is an empty string and
// $url is http://www.w3.org/2005/Atom
foreach($ns as $prefix=>$url)
{
//no prefix so use $d
if($prefix=="")
{
$prefix = $d;
}
//register the namespace
$xml->registerXPathNamespace($prefix, $url);
}
$result = $xml->xpath('/x:rss/x:channel/x:item');
//nothing
print_r($result);
我不确定为什么这不起作用。我在想注册命名空间本质上应该是现有命名空间的别名,因此“x:rss/x:channel/x:item”应该是一个有效的查询。谁能告诉我我在这里做错了什么?任何意见,将不胜感激。谢谢!