我正在尝试显示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 );
}
}
}
但这不是输出任何东西。谁能告诉我这里有什么问题?
答案 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
}
}