PHP - 无法使用SimpleXML解析属性

时间:2017-10-04 16:44:45

标签: php xml simplexml

给出以下xml:

...
[global]
    # TDS protocol version
;   tds version = 4.2
tds version = 8.0
client charset = UTF-8
...

我正在尝试解析第三个属性~ns2:version type =“SW”但是在运行以下代码时我什么都没得到。

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

运行此命令会提供以下输出:

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

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

enter image description here

如何正确获取该属性?

2 个答案:

答案 0 :(得分:1)

至少就SimpleXML而言,你有一些非常讨厌的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

答案 1 :(得分: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];

Out put:

3.4.1(777)