2009-06-14 143 views
30

在XML文檔中,我具有共享相同名稱的元素,但屬性的值定義了它的數據類型,我想選擇所有這些元素這些文件具有一定的價值。我是否需要使用XPath(如果是這樣,您能否建議正確的語法)還是有更優雅的解決方案?SimpleXML:選擇具有某個屬性值的元素

下面是一些示例XML:

<object> 
    <data type="me">myname</data> 
    <data type="you">yourname</data> 
    <data type="me">myothername</data> 
</object> 

我要選擇的<object>所有<data>標籤兒童的內容,誰的類型是me

PS - 我試圖使用PHP與Netflix API接口 - 這對我的問題應該沒有關係,但如果您想提出一個更好的/更好的方式來做到這一點,我全都是耳朵。

+0

X-價:[在XPath中實施條件](http://stackoverflow.com/q/3448005/367456) – hakre 2013-07-09 09:43:57

回答

44

試試這個XPath:

/object/data[@type="me"] 

所以:

$myDataObjects = $simplexml->xpath('/object/data[@type="me"]'); 

如果object是不是你的文檔的根,用//object/data[@type="me"]來代替。

+4

感謝您提供完整的包裝php行,而不僅僅是xpath字符串。 你永遠不能告訴事情是否需要引號,以及其他類似於xpath字符串的東西。 在上下文中查看事物提供的關鍵信息,如果您不知道它已經無法猜測。 – ahnbizcad 2015-06-17 18:59:59

4

我剛剛爲我做了一個功能,它只是抓住了第一個結果。你的旅費可能會改變。

function query_attribute($xmlNode, $attr_name, $attr_value) { 
    foreach($xmlNode as $node) { 
    switch($node[$attr_name]) { 
     case $attr_value: 
     return $node; 
    } 
    } 
} 

用法:

echo query_attribute($MySimpleXmlNode->Customer, "type", "human")->Name; 

(對於下面的XML)

<Root><Customer type="human"><Name>Sam Jones</name></Customer></Root> 
+11

爲什麼不使用XPath Gumbo建議?爲什麼使用開關而不是更容易閱讀`if($ node [$ attr_name] == $ attr_value``? – dimo414 2012-05-29 15:34:14

相關問題