2011-06-13 92 views
1

我一直在用砖头撞墙,所以非常感谢您的帮助。我第一次使用xpath,让它能够完成我所需要的大部分工作,而且没有任何问题。使用Xpath从命名空间获取XML的数据

下面是一个例子片段:

$urlw = "http://www.wahanda.com/rss/mobdeal.xml"; 
$wf = gzopen ($urlw, 'r'); 
$wxml = new SimpleXMLElement (fread ($wf, 1000000)); 

foreach($wxml->xpath ('/rss/channel/item') as $entry) 
{ 
    $price = $entry->price; 
    echo $price . "<br/>"; 
} 

我的问题是我目前使用的饲料有命名空间声明,以“价格”节点其实是在“W:价格”。我想使用的一些节点前缀为“w:”,而其他节点则不是。因此,我的代码无法获取前缀节点的内容。有人可以告诉我我如何解决这个问题吗?从阅读我添加以下内容:

$wxml->registerXPathNamespace('w', 'http://www.wahanda.com/ns/1.0'); 

但仍然不确定我需要从这里做什么。

非常感谢您的帮助。

+0

一旦你注册的前缀,你可以[查询与前缀节点(http://stackoverflow.com/search?q=registerXPathNamespace+php),例如''w:foo/w:bar'与['xpath()'方法](http://de2.php.net/manual/en/simplexmlelement.xpath.php)。请澄清问题。 – Gordon 2011-06-13 09:03:25

+0

嗨@Gordon - 我试图找出我需要取代$ price = $ entry-> price;在我上面的代码中给出了XML中每个“item”的单个w:价格值。我在下面的建议中使用了$ price = $ wxml-> xpath('// w:price'),但是这会返回一个数组 - 因为每个“item”中只有一个“w:price”节点,我认为它会起作用。 .. – Chris 2011-06-13 09:28:04

+0

在这种情况下,你必须使用['children()'](http://de2.php.net/manual/en/simplexmlelement.children.php)。有关类似问题,请参见[PHP SimpleXML命名空间问题](http://stackoverflow.com/questions/6027398/php-simplexml-namespace-problem/6027507#6027507)。 – Gordon 2011-06-13 09:30:30

回答

0

您正处于正确的轨道上。你所要做的就是用命名空间编写一个xpath查询。喜欢的东西:

$wxml->xpath ('//w:price') 
+0

谢谢@datasage。当我替换$ price = $ entry-> price; $ price = $ wxml-> xpath('// w:price');在上面的代码中,我得到的输出是“Array”。然而,每个“item”中只有一个“w:price”节点,所以我认为它应该每次挑选一个单独的价格,而不是数组? – Chris 2011-06-13 09:22:47

+0

@Chris阵列中有多少个元素? – 2011-06-13 19:48:59