XML节点访问属性与命名空间

时间:2018-05-21 10:19:19

标签: php xml

这是我的xml数据。

<?xml version="1.0" encoding="UTF-8"?>
    <ns1:catalog
xmlns:ns1="http://www.omnichannelintegrationlayer.com/xml/catalog/2016-01-01" catalog-id="at-master-catalog">
<ns1:product product-id="4132002004">
    <ns1:min-order-quantity>1</ns1:min-order-quantity>
    <ns1:step-quantity>1</ns1:step-quantity>
    <ns1:short-description
        xmlns:ns2="xml" ns2:lang="de-AT">Jogginghose Cacy jr
    </ns1:short-description>
    <ns1:short-description
        xmlns:ns2="xml" ns2:lang="de-CH">Jogginghose Cacy jr
    </ns1:short-description>
</ns1:product>

我试图根据ns2:lang属性过滤xml的简短描述。

这是我到目前为止所做的:

foreach ($xml->xpath("//ns1:product[@product-id='".$productid."']/ns1:short-description/") as $short_description) {
 $namespaces = $short_description->getNameSpaces(true);
    $ns1        = $short_description->children($namespaces['ns1']);
    $ns2        = $short_description->children($namespaces['ns2']);

    var_dump($ns2);
    echo $ns2["lang"];
}

var_dump的输出看起来没问题:

object(SimpleXMLElement)#27 (1) { ["@attributes"]=> array(1) { ["lang"]=> string(5) "de-AT" } }

但是我无法访问数组,因为当我回显$ ns2 [&#34; lang&#34;]时,我得到了NULL。

我已经尝试了不同的解决方案,例如首先声明命名空间但没有运气。

提前致谢。

1 个答案:

答案 0 :(得分:1)

您要查找的值位于attributes,属性使用命名空间,您可以将其作为参数传递给attributes方法。

属性本身属于SimpleXMLElement类型,并且有一个方法__toString来获取直接在此元素中的文本内容。

您可以使用echo $short_description->attributes($namespaces['ns2'])->lang;或将其投放到(string)

您可以将代码更新为:

$namespaces = $xml->getNamespaces(true);
foreach ($xml->xpath("//ns1:product[@product-id='".$productid."']/ns1:short-description") as $short_description) {
    $langAsString = (string)$short_description->attributes($namespaces['ns2'])->lang;
    echo $langAsString . "<br>";
}

那会给你:

de-AT
de-CH

Demo