XML 获取命名空间节点值
XML Obtaining Namespaced node values
我有这个 xml 片段:
<ModelList>
<ProductModel>
<CategoryCode>06</CategoryCode>
<Definition>
<ListProperties xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:KeyValueOfstringArrayOfstringty7Ep6D1>
<a:Key>Couleur principale</a:Key>
<a:Value>
<a:string>Blanc</a:string>
<a:string>Noir</a:string>
<a:string>Gris</a:string>
<a:string>Inox</a:string>
<a:string>Rose</a:string>
我试图用这个解析(使用简单xml):
$xml->registerXPathNamespace('a', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays');
$x = $xml->xpath('//a:KeyValueOfstringArrayOfstringty7Ep6D1');
//var_dump($x);
foreach($x as $k => $model) {
$key = (string)$model->Key;
var_dump($model->Key);
}
当前的 var 转储 returns 一大堆
object(SimpleXMLElement)[7823]
其中似乎包含 a:Value 块。那么如何获取节点的值,而不是被炸毁的对象树呢?
而且人们认为 xml 很容易解析。
听起来你的问题更多的是 SimpleXML 和 XML 本身。您可能想尝试 DOM.
您可以在 XPath 本身中转换结果,因此表达式将直接 return 一个标量值。
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('a', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays');
$items = $xpath->evaluate('//a:KeyValueOfstringArrayOfstringty7Ep6D1');
foreach ($items as $item) {
$key = $xpath->evaluate('string(a:Key)', $item);
var_dump($key);
}
输出:
string(18) "Couleur principale"
所以我最终解决了这个问题。仅供参考(经过多次试验和错误,包括基于 ThW 的答案的解决方案),此代码正确获取密钥 属性:
$xml->registerXPathNamespace('a', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays');
$x = $xml->xpath('//a:KeyValueOfstringArrayOfstringty7Ep6D1/a:Key');
//var_dump($x);
foreach($x as $k => $model) {
var_dump((string)$model);
}
我有这个 xml 片段:
<ModelList>
<ProductModel>
<CategoryCode>06</CategoryCode>
<Definition>
<ListProperties xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
<a:KeyValueOfstringArrayOfstringty7Ep6D1>
<a:Key>Couleur principale</a:Key>
<a:Value>
<a:string>Blanc</a:string>
<a:string>Noir</a:string>
<a:string>Gris</a:string>
<a:string>Inox</a:string>
<a:string>Rose</a:string>
我试图用这个解析(使用简单xml):
$xml->registerXPathNamespace('a', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays');
$x = $xml->xpath('//a:KeyValueOfstringArrayOfstringty7Ep6D1');
//var_dump($x);
foreach($x as $k => $model) {
$key = (string)$model->Key;
var_dump($model->Key);
}
当前的 var 转储 returns 一大堆
object(SimpleXMLElement)[7823]
其中似乎包含 a:Value 块。那么如何获取节点的值,而不是被炸毁的对象树呢?
而且人们认为 xml 很容易解析。
听起来你的问题更多的是 SimpleXML 和 XML 本身。您可能想尝试 DOM.
您可以在 XPath 本身中转换结果,因此表达式将直接 return 一个标量值。
$dom = new DOMDocument();
$dom->loadXml($xml);
$xpath = new DOMXPath($dom);
$xpath->registerNamespace('a', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays');
$items = $xpath->evaluate('//a:KeyValueOfstringArrayOfstringty7Ep6D1');
foreach ($items as $item) {
$key = $xpath->evaluate('string(a:Key)', $item);
var_dump($key);
}
输出:
string(18) "Couleur principale"
所以我最终解决了这个问题。仅供参考(经过多次试验和错误,包括基于 ThW 的答案的解决方案),此代码正确获取密钥 属性:
$xml->registerXPathNamespace('a', 'http://schemas.microsoft.com/2003/10/Serialization/Arrays');
$x = $xml->xpath('//a:KeyValueOfstringArrayOfstringty7Ep6D1/a:Key');
//var_dump($x);
foreach($x as $k => $model) {
var_dump((string)$model);
}