2009-06-14 104 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

相关问题