2013-05-27 214 views
0

我遇到XPath查询时遇到问题。我正在使用//link[@rel='alternate'],但是这会返回一个空节点集。我想写一个查询,将选择所有链接节点的href属性的值,其中相对=备用按属性值筛选Xpath并选择替代属性

我在做什么错?

下面是我正在使用的xml结构的简化示例。

<feed> 
    <entry> 
     <id>1980475</id> 
     <link rel="post" href="http://..."></link> 
     <link rel="edit" href="http://..."></link> 
     <link rel="alternate" href="http://..."></link> 
    </entry> 
    <entry> 
     <id>1980476</id> 
     <link rel="post" href="http://..."></link> 
     <link rel="edit" href="http://..."></link> 
     <link rel="alternate" href="http://..."></link> 
    </entry> 
</feed> 

这里是PHP代码我使用,以及:

$xmlDoc = simplexml_load_file("somefile.xml"); 
$nodelist = $xmlDoc->xpath("//link[@rel='alternate']"); 
+0

你也可以上传你正在与试图代码? –

+0

'// link [@ rel ='alternate']' '$ xmlDoc = simplexml_load_file(“filepath.xml”); $ nodelist = $ xmlDoc-> xpath(“// link [@ rel ='alternate']);' – ajarrel

+0

我试过了你的代码和count($ xml-> xpath('// link [@ rel =”alternate “]'))'返回2,这是正确的:http://3v4l.org/iG8o8 – Passerby

回答

1

由于@Jens注意,你可能处理一个Atom feed。 Atom中的XML元素位于Atom名称空间中,其URI是http://www.w3.org/2005/Atom

您需要注册该名称空间并在XPath表达式中使用它。请参阅this answer关于如何做到这一点。

当您发布的XML输入的“简化样本”,你大概删除默认的命名空间声明,在

<feed xmlns="http://www.w3.org/2005/Atom"> 

这看似不起眼的变化意味着<feed>和所有的所有元素的后裔从它是在没有名字空间的情况下,而在实际输入数据中,它们位于Atom命名空间中。这可以解释为什么在样本输入上测试XPath表达式时(如@Passerby所述),但对实际输入无效。

如果您注册a为Atom名称空间的名称空间前缀,如在我挂到上面的答案,你的XPath表达式是:

xpath("//a:link[@rel='alternate']")