2017-10-04 66 views
0

考慮下面的XML解析屬性:PHP - 無法使用SimpleXML

<data xmlns:ns2="..."> 
    <versions> 
      <ns2:version type="HW">E</ns2:version> 
      <ns2:version type="FW">3160</ns2:version> 
      <ns2:version type="SW">3.4.1 (777)</ns2:version> 
    </versions> 
    ... 
</data> 

我試圖解析第三個屬性〜NS2:版型=「SW」,但運行下面的代碼時,我什麼也沒得到。 。

$s = simplexml_load_file('data.xml'); 

echo $s->versions[2]->{'ns2:version'}; 

運行此給出以下的輸出:

$s = simplexml_load_file('data.xml'); 

var_dump($s->versions); 

enter image description here

如何正確獲取該屬性?

回答

1

你已經有了一些很煩人的XML與那裏工作,至少儘可能的SimpleXML而言。

version元素都在ns2命名空間,所以爲了遍歷它們,你需要做的是這樣的:

$s = simplexml_load_string($xml); 

foreach ($s->versions[0]->children('ns2', true)->version as $child) { 
    ... 
} 

children()方法返回當前標籤的孩子,但只有在默認的命名空間。如果要訪問其他名稱空間中的元素,則可以傳遞本地別名和第二個參數true

更復雜的部分是type屬性是而不是被認爲是同一名稱空間的一部分。這意味着您不能使用標準的$element['attribute']表單來訪問它,因爲您的元素和屬性位於不同的名稱空間中。

幸運的是,的SimpleXML的attributes()方法相同的方式工作作爲children(),因此對全局命名空間訪問的屬性,你可以通過它一個空字符串:

$element->attributes('')->type 

在充分,這就是:

$s = simplexml_load_string($xml); 

foreach ($s->versions[0]->children('ns2', true)->version as $child) { 
    echo (string) $child->attributes()->type, PHP_EOL; 
} 

這將讓你的輸出

HW 
FW 
SW 
+0

三江源版本很多! – BDillan

0

獲取第三個屬性。

$s = simplexml_load_file('data.xml'); 
$sxe = new SimpleXMLElement($s); 
foreach ($sxe as $out_ns) { 
    $ns = $out_ns->getNamespaces(true); 
    $child = $out_ns->children($ns['ns2']); 
} 

echo $child[2]; 

輸出地說:

3.4.1(777)