2014-06-06 81 views
0

我有一个XML文件如下:Access中的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属性?

回答

0

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

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

查看PHP文档的basic usage页面。

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

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

0

使用xpath选择以简单的方式所有url -attributes,而不需要通过XML迭代
xpath是像SQL的XML:

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

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

你完成了。见它的工作:https://eval.in/159586

评论:

xpath -expression读作:

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

$urlsSimpleXml -Objects的阵列,如果需要的话转换为string,例如当进行比较时。