2012-03-14 70 views
2

我試圖分析出我被它的屬性之一引用一個節點的價值得到子節點。但我不知道語法的SimpleXML的基於屬性

XML:

<data> 

    <poster name="E-Verify" id="everify"> 

    <full_image url="e-verify-swa-poster.jpg"/> 

    <full_other url=""/> 

    </poster> 


    <poster name="Minimum Wage" id="minwage"> 

    <full_image url="minwage.jpg"/> 

    <full_other url="spa_minwage.jpg"/> 

    </poster> 
</data> 

這裏就是我想要得到full_image的URL值,其中投稿者ID等於minwage:

$xml = simplexml_load_file('PosterData.xml'); 
$main_url = $xml->full_image[name] where poster[id] = "minwage"; 
//something like that. 
echo $main_url; 

Result: minwage.jpg 

如果任何人有任何資源涵蓋這個東西請分享。

+0

至於你問的資源,是有是:在XPath的實施條件(http://stackoverflow.com/questions/3448005/implementing-condition-in-xpath)和[SimpleXML的獲取根據元素含量上屬性值](http://stackoverflow.com/q/4736417/367456) – hakre 2013-07-08 19:44:22

回答

5

簡單循環海報元素,記得投的屬性值轉換爲字符串,因爲你要對它們進行比較(也許它們輸出)作爲字符串:

$xml = simplexml_load_file('PosterData.xml'); 

foreach ($xml->poster as $poster) { 
    if ((string) $poster['id'] == 'minwage') { 
     echo (string) $poster->full_image['url']; 
    } 
} 
+0

即工作就像一個魅力。我一直在思考這個過程。 +1 – Denoteone 2012-03-14 06:04:26

1

您可以使用:

$object = simplexml_load_string('<data><poster name="E-Verify" id="everify"><full_image url="e-verify-swa-poster.jpg"/><full_other url=""/></poster><poster name="Minimum Wage" id="minwage"><full_image url="minwage.jpg"/><full_other url="spa_minwage.jpg"/></poster></data>'); 

foreach ($object as $value) { 
    echo "URL: ".$value->full_image->attributes(); 
    echo "<br>"; 
} 

要麼使用simplexml_load_file('Some external file.xml')如果調用外部文件。

19

你應該能夠使用SimpleXMLElement::xpath()對一個簡單的XML文檔運行xpath query

$xml = simplexml_load_file('PosterData.xml'); 
$main_url = $xml->xpath('name[@id="minwage"]/full_image')[0]; 

echo $main_url; 
+0

這就是我最初的嘗試。謝謝(你的)信息。 – Denoteone 2012-03-14 06:45:08

+1

這比循環更優雅,應該是例外的答案。 – Select0r 2015-11-11 10:34:48

+0

我一直試圖讓這段代碼的工作,通過複製在我的本地代碼,但我得到「未定義偏移:0」請參閱: https://stackoverflow.com/questions/48154956/xpath-query-on -simplexml-文檔未定義偏移-0 – buck1112 2018-01-08 17:15:02