XML获取Namespaced节点值

时间:2015-02-02 15:27:32

标签: php xml simplexml

我有这个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>

我试图用这个解析(使用simplexml):

$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 var当前返回了一大堆

object(SimpleXMLElement)[7823]

其中似乎包含a:值块。那么我如何得到节点的值,而不是爆破的对象树?

人们认为xml很容易被解析。

2 个答案:

答案 0 :(得分:1)

听起来像问题更多的是SimpleXML和XML本身一样。您可能想尝试DOM。

您可以在XPath中自行转换结果,因此表达式将直接返回标量值。

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

答案 1 :(得分:1)

所以我最终解决了这个问题。作为参考(经过大量试验和错误,包括基于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);
        }