给出以下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'};
如何正确获取该属性?
答案 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)