2012-03-14 118 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