这是我的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。
我已经尝试了不同的解决方案,例如首先声明命名空间但没有运气。
提前致谢。
答案 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