2014-06-06 82 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,例如當進行比較時。