SimpleXML命名空间属性和值是空的?

时间:2015-01-28 16:22:04

标签: php xml simplexml

我有以下类型的XML结构:

<catalog xmlns="http://www.namespace.com">
    <product product-id="test-product">
        <page-attributes>
            <page-title xml:lang="en">test</page-title>
            <page-title xml:lang="de">test2</page-title>
        </page-attributes>
    </product>
</catalog>

我使用以下内容来获取产品及其page-title元素:

$xml->registerXPathNamespace('ns', $xml->getNamespaces()[""]);
$xpath = '//ns:product[@product-id="test-product"]';
$product = $xml->xpath($xpath)[0];

foreach ($product->{'page-attributes'}->{'page-title'} as $title) {
    var_dump($title);
    var_dump($title->{"@attributes"});
    var_dump($title->attributes());
}

但我得到:

object(SimpleXMLElement)#4 (0) {
}
object(SimpleXMLElement)#6 (0) {
}
object(SimpleXMLElement)#6 (0) {
}
object(SimpleXMLElement)#6 (0) {
}
object(SimpleXMLElement)#4 (0) {
}
object(SimpleXMLElement)#4 (0) {
}

如何获取page-title元素(testtest2)的值?另外我如何获得属性?属性在它们前面有xml:。这是否意味着属性只在他们自己的命名空间中?

1 个答案:

答案 0 :(得分:2)

您的代码有两个问题:

  • 正如@MichaelBerkowski所提到的,如果您尝试检索它的值,则需要将SimpleXMLElement转换为string

  • 如果您尝试检索xml:属性的值,则需要指定名称空间lang

您的代码应如下所示:

$xml->registerXPathNamespace('ns', $xml->getNamespaces()[""]);

$xpath = '//ns:product[@product-id="test-product"]';
$product = $xml->xpath($xpath)[0];

foreach ($product->{'page-attributes'}->{'page-title'} as $title) {
    var_dump((string) $title);
    var_dump((string) $title->attributes('xml', TRUE)['lang']);
}

输出:

string(4) "test"
string(2) "en"
string(5) "test2"
string(2) "de"

关于字符串转换。请注意,如果您尝试执行以下操作:

echo "Title: $title";

您不必显式转换为string,因为SimpleXMLElement支持__toString()方法,PHP会自动将其转换为字符串 - 在这样的字符串上下文中

var_dump()不能假设字符串上下文,因此它会输出&#34; real&#34;变量的类型:SimpleXMLElement