访问SimpleXML节点的XML属性

时间:2014-06-06 09:42:00

标签: php xml simplexml

我有一个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>标记以收集所有网址,但未找到如何访问SimpleXML节点的属性。

以下是我尝试过的代码但没有成功:

$contentXML = simplexml_load_file('file.xml');
$urls = array();

foreach($xml->menus->defaultMenu->group->menuItem as $menuItem) {
    $urls[] = $menuItem->url;
}

但是,此方法不正确,因为数组仅在循环后获取空值。那么,我如何访问SimpleXML节点的XML属性呢?

3 个答案:

答案 0 :(得分:0)

要访问SimpleXML节点的属性,必须将节点对象用作数组。例如:

foreach($contentXML->menus->defaultMenu->group->menuItem as $menuItem) {
    $urls[] = $menuItem["url"];
}

请参阅PHP文档的basic usage页面。

您也可以在节点上使用attributes()方法,但这非常详细。

答案 1 :(得分:0)

使用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

答案 2 :(得分:0)

使用xpath以简单的方式选择所有url - 属性,而无需对XML进行迭代
xpath就像SQL for XML:

$xml = simplexml_load_string($x); // assume XML in $x

$urls = $xml->xpath("//*[@url]/@url");

你完成了。看到它有效:https://eval.in/159586

评论:

xpath - 表达式读作:

  • //*在层次结构中的任何位置,选择任何节点...
  • [@url]具有url ...
  • 属性
  • /@url并仅返回属性url

$urlsSimpleXml - 对象的数组,如有必要,可投射到string,例如进行比较时。