2012-09-13 81 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"]');