SimpleXML:选择具有特定属性值的元素

Posted

技术标签:

【中文标题】SimpleXML:选择具有特定属性值的元素【英文标题】:SimpleXML: Selecting Elements Which Have A Certain Attribute Value 【发布时间】:2010-11-02 19:25:03 【问题描述】:

在 XML 文档中,我有共享相同名称的元素,但属性的值定义了它是什么类型的数据,我想从文档中选择所有具有特定值的元素。我是否需要使用 XPath(如果需要,您能否建议正确的语法)还是有更优雅的解决方案?

这是一些 XML 示例:

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

我想选择&lt;object&gt;的所有&lt;data&gt;标签的内容,他们的类型是me

PS - 我正在尝试使用 php 与 Netflix API 进行交互 - 这对我的问题应该无关紧要,但如果您想提出一个好的/更好的方法,我会全力以赴。

【问题讨论】:

X-Ref: Implementing condition in XPath 【参考方案1】:

试试这个 XPath:

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

读作:

选择 (/) 名为 object 的当前元素的子元素 选择(/)他们的孩子叫data 过滤器 ([...]) 列出...的元素 type 属性(@ 表示“属性”) 具有文本值me

所以:

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

如果object 不是您文档的根目录,您可能想改用//object/data[@type="me"]// 的意思是“找到所有后代”而不是“找到所有孩子”。

【讨论】:

元素有默认xmlns时可以这样做吗?【参考方案2】:

我刚刚做了一个函数来为我做这件事;它只获得了第一个结果。您的里程可能会有所不同。

function query_attribute($xmlNode, $attr_name, $attr_value) 
  foreach($xmlNode as $node)  
    if($node[$attr_name] == $attr_value) 
        return $node;
    
  

用法:

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

(对于下面的 XML)

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

【讨论】:

为什么不使用建议的 XPath Gumbo?为什么要使用开关而不是更容易阅读的if($node[$attr_name] == $attr_value) 这是一个很有用的示例,因为有时您想要合并额外的逻辑,因此 XPath 不是最好的方法。

以上是关于SimpleXML:选择具有特定属性值的元素的主要内容,如果未能解决你的问题,请参考以下文章

在 SimpleXML for PHP 中删除具有特定属性的子项

css 或 xpath 选择器:具有特定值的任何属性的元素

PHP SimpleXML解析具有多个属性的元素

具有特定值的任何属性的所有元素的 XPath?

JQuery选择器

js选择器