访问 SimpleXML 节点的 XML 属性
Posted
技术标签:
【中文标题】访问 SimpleXML 节点的 XML 属性【英文标题】:Access the XML attributes of a SimpleXML node 【发布时间】:2014-07-27 13:01:44 【问题描述】:我有一个如下的 XML 文件:
<menus>
<defaultMenu>
<group>
<menuItem name="Example one" url="http://www.google.com">
<menuItem name="Example Two" url="http://www.yahoo.com" />
<menuItem name="Example Three" url="http://www.bing.com" />
</menuItem>
</group>
</defaultMenu>
</menus>
我想遍历 <menuItem>
标记以收集所有 URL,但没有找到如何访问 SimpleXML 节点的属性。
这是我尝试但没有成功的代码:
$contentXML = simplexml_load_file('file.xml');
$urls = array();
foreach($xml->menus->defaultMenu->group->menuItem as $menuItem)
$urls[] = $menuItem->url;
但是,这种方法是不对的,因为数组在循环后只能得到空值。那么,如何呢?
【问题讨论】:
【参考方案1】:要访问 SimpleXML 节点的属性,您必须将节点对象用作数组。示例:
foreach($contentXML->menus->defaultMenu->group->menuItem as $menuItem)
$urls[] = $menuItem["url"];
请参阅 php 文档的 basic usage 页面。
您也可以在节点上使用attributes()
方法,但这很冗长。
【讨论】:
【参考方案2】:使用children()
和attributes()
方法:
foreach($contentXML->menus->defaultMenu->group->menuItem->children() as $menuItem)
$urls[] = $menuItem->attributes()['url']; // (PHP v >= 5.4)
$attrs = $menuItem->attributes(); // (PHP v < 5.4)
$urls[] = $attrs['url'];
Doc
【讨论】:
【参考方案3】:使用xpath
以一种简单的方式选择所有url
属性无需迭代 XML。xpath
类似于 XML 的 SQL:
$xml = simplexml_load_string($x); // assume XML in $x
$urls = $xml->xpath("//*[@url]/@url");
你已经完成了。看到它工作:https://eval.in/159586
评论:
xpath
-表达式读作:
//*
在层次结构中的任何位置,选择任何节点...
[@url]
具有属性 url
...
/@url
并仅返回属性 url
。
$urls
是 SimpleXml
-Objects 的数组,如有必要,转换为 string
,例如比较时。
【讨论】:
以上是关于访问 SimpleXML 节点的 XML 属性的主要内容,如果未能解决你的问题,请参考以下文章