访问 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>

我想遍历 &lt;menuItem&gt; 标记以收集所有 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

$urlsSimpleXml-Objects 的数组,如有必要,转换为 string,例如比较时。

【讨论】:

以上是关于访问 SimpleXML 节点的 XML 属性的主要内容,如果未能解决你的问题,请参考以下文章

如何在命名空间环境中访问 SimpleXML 节点?

如何将 XML 属性转换为文本节点

使用 simplexml 获取 XML 文档的根节点

使用 simplexml 将 xml 节点值更新 1。是不是可以?

php如何解析多级xml报文?

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