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>
我想选择<object>
的所有<data>
标签的内容,他们的类型是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:选择具有特定属性值的元素的主要内容,如果未能解决你的问题,请参考以下文章