2012-09-13 40 views
2

XML:如何使用下面的兄弟XPath查询与PHP?

<Routes> 
    <Route type="source" > 
    <Table> 
    <Tablename>incoming</Tablename> 
    <Fields> 
     <Fieldsname ref="dest">truegoto</Fieldsname> 
    </Fields> 
    </Table> 
    </Route> 
</Routes> 

PHP:

$doc = new SimpleXMLElement('routingConfig.xml', null, true); 
$foo = $doc->xpath('/Routes/Route[@type="source"]/Table/Tablename[incoming]/following-sibling::Fields/Fieldsname[@ref="dest"]'); 
print_r($foo); 

试图通过了解<Tablename>incoming</Tablename>的方式来获得truegoto。我目前的代码只是返回一个空数组:/

回答

1

问题不在following-sibling部分。到那时,你已经没有选择节点了。这是因为Tablename[incoming]的意思是“Tablename元素有一个名为incoming的子元素”。你需要Tablename[.="incoming"]来代替,该测试元素的内容:

/Routes/Route[@type="source"]/Table/Tablename[.="incoming"]/following-sibling::Fields/Fieldsname[@ref="dest"] 
+0

任何手动或引用?从来没有见过这种语法。现在我想到了/ Table [Tablename =“incoming”] ...应该也可以工作 – Jared

+0

@Jared'.'表示“当前项目”。您可以在[此MSDN文章]中看到一个示例(http://msdn.microsoft.com/zh-cn/library/ms256086.aspx)。是的,你的选择也应该很好。 – lonesomeday

1

虽然我会接受@ lonesomeday的答案,这里也许是一个更容易阅读的选择:

$foo = $doc->xpath('/Routes/Route[@type="source"]/Table[Tablename="incoming"]/Fields/Fieldsname[@ref="dest"]');