SimpleXML不返回属性

时间:2015-05-14 20:38:38

标签: php xml simplexml

我正在尝试显示xml文件中所有项目的属性。我有以下xml文件:

<OPupdate>
    <Version>Testing</Version>
    <VersionNumber>1.0</VersionNumber>
    <GenerationDate>2015-04-24T11:21:53.013</GenerationDate>
    <Product>
        <ProductID>P001</ProductID>
        <ProductAttribute>
            <Attribute ID="1" description="Att1" lang="en-GB" type="string" displaysequence="0">A</Attribute>
            <Attribute ID="2" description="Att2" lang="en-GB" type="string" displaysequence="0">B</Attribute>
            <Attribute ID="3" description="Att3" lang="en-GB" type="string" displaysequence="0">B</Attribute>
        </ProductAttribute>
    </Product>
</OPupdate>

这是在php:

$xml = simplexml_load_file('test.xml');
foreach( $xml->Product as $product ) {
    foreach ( $product->ProductAttribute as $attribute ) {
        foreach( $attribute->attributes() as $key => $value ) {
            printf( '1<p><strong>%s:</strong> %s</p>', $key, $value );
        }
    }
}

但这不是输出任何东西。谁能告诉我这里有什么问题?

4 个答案:

答案 0 :(得分:2)

这里的混淆是术语之一 - 在下文中,“Foo”是元素,“bar”是属性

<Foo bar="value">content</Foo>

在您的示例XML中,有一个元素,其名称恰好是“属性”:

<Attribute ID="1" description="Att1" lang="en-GB" type="string" displaysequence="0">A</Attribute>

它有几个属性,例如“ID”和“description”,以及一些内容“A”。

因此,要访问它,您需要与用于其他元素的语法完全相同的语句,“Product”和“ProductAttribute”:

foreach ( $attribute->Attribute as $something ) {
     echo (string)$something; // content of the element: 'A'
     echo (string)$something['ID']; // value of the 'ID' attribute: '1'
}

假设总是只有一个“ProductAttribute”,就像在你的例子中一样,你可以做到这一点,它更具可读性:

foreach ( $product->ProductAttribute->Attribute as $attribute ) {
     echo (string)$attribute; // A
     echo (string)$attribute['ID']; // 1
}

您找到的attributes()方法将允许您遍历元素的属性:

freach ( $attribute->attributes() as $key => $value ) {
     echo "$key: $value\n";
}

对于第一个“Attribute”元素,这将产生这个键和值列表:

  

ID:1
  描述:Att1
  郎:en-GB
  类型:字符串
  displaysequence:0

然后是其他“属性”元素的类似列表。

归咎于英语的不精确性,以及设计这种XML结构的人!

答案 1 :(得分:0)

试试这个

$xml = simplexml_load_file('test.xml');
foreach( $xml->Product as $product ) {
    foreach ( $product->ProductAttribute as $attribute ) {
      echo  $attribute['ID'];
    }
}

实际上$ property将被视为数组或其属性。

答案 2 :(得分:0)

更新评论:
        foreach($ pattribute-&gt;属性为$ attribute){
            foreach($ attribute-&gt; attributes()as $ key =&gt; $ value)
        你错过了一个循环,
谢谢你指出来。
旧:
属性是一个数组
使用:foreach($ property as $ key =&gt; $ value) 而不是foreach($ attribute-&gt; attributes()为$ key =&gt; $ value)

答案 3 :(得分:0)

它适用于此:

foreach( $xml->Product as $product ) {
    foreach ( $product->ProductAttribute as $attribute ) {
        foreach( $attribute->children() as $att) {
            echo $att['description'];
        }
    }
}

修改

foreach( $xml->Product as $product ) {
    foreach ( $product->ProductAttribute->Attribute as $attribute ) {
        $column = $attribute['description']->__toString(); // the description attribute of the Attribute node
        $value = $attribute->__toString(); // the actual value of the Attribute item
    }
}