這是我的XML(片段):遍歷XML樹來獲得屬性值
<?xml version="1.0" encoding="utf-8"?>
<test>
<body label_position="left">
<page number="1">
<itemset name="">
<item name="" id="1" />
<item name="" id="2" label_position="right" />
</itemset>
</page>
</body>
</test>
我想做到:
是否<item id="1">
有label_position
屬性設置?
(1)如果是,請將其退回。
(2)如果沒有,請檢查節點的父節點是否屬於該屬性。 (3)如果父母具有該屬性,則返回該屬性。
(4)如果不是,則轉到步驟(2)。 <body>
是要檢查的「最舊」節點。
我已經試過什麼:
我使用simplexml
和xpath
,我試圖選擇<item>
及其所有祖先,然後向上遍歷樹並與label_position
第一次出現停止。
$xml->xpath("//item[@id='1']::ancestors-or-self/@label_position");
產生了invalid expression
。
(1)如何獲得此表達式的工作方式?
(2)這可以通過「xpath-only」完成 - 無需遍歷樹並執行搜索?
編輯:感謝choroba & dirkk,我可以把它在一起:
$test = (string)array_reverse($xml->xpath("//item[@id='2']/ancestor-or-self::*/@label_position"))[0];
說明:如果兩個<item>
和<body>
具有屬性,xpath
將返回這兩個值的數組,第一個是<body>
。在這種情況下,我想先獲得<item>
,這就是爲什麼array_reverse()
。
看到它的工作:http://codepad.viper-7.com/jDPIde
謝謝,作品像一個魅力! – michi