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);
        }