我有一个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属性呢?
答案 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'];
}
答案 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
。 $urls
是SimpleXml
- 对象的数组,如有必要,可投射到string
,例如进行比较时。