PHP SimpleXML @attributes节点列表的行为

时间:2012-11-30 19:16:37

标签: php xml simplexml

我已经看过几次这个问题了,想要一个明确的答案。

在xml:

中给出这个结构
<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>

我无法访问属性'order'。 var_dump(毫不奇怪)没有显示ByteListSet的任何属性。实际上,foreach迭代不会生成@attributes项。

但是,结构如下:

<ByteListSet>
    <Byte Order="0"><Value>3729</Value></Byte>
</ByteListSet>

在具有子字节的ByteListSet中正确结果,该字节是具有@attributes的SimpleXmlObject。

我认为SimpleXML确实从第一个案例中获取了@attributes,但它在哪里保留它们?麻烦的是,在前一个结构中,ByteListSet在var_dump上产生了这个 - &gt; children():

object(SimpleXMLElement)[25]
  public 'Byte' => string '14' (length=2)

如果我上面有get_object_vars()和var_dump,我只是得到:

string '14' (length=2)

表示Byte不是作为xml对象返回给我的,而是作为字符串返回给我;作为它上面的ByteList对象的属性。

Order =“0”在某处,但我无法访问它。我怎么做到的?注意: - &gt; attributes()如您所料返回一个空白数组。

(我们不控制此架构,因此无法对其进行重组。)

1 个答案:

答案 0 :(得分:0)

您写道:

  

在xml:

中给出这个结构
<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>
     

我无法访问属性&#39; order&#39;。

当然,因为属性order不存在。 XML is case-sensitive,该属性的名称为Order,开头为大写O

使用正确的属性名称,您可以在手册中找到Example #5 in the basic examples of the SimpleXML extension中的大纲中访问该值:

$ByteListSet = simplexml_load_string(<<<XML
<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>
XML
);

echo $ByteListSet->Byte['Order']; # 0

请注意,您在var_dumpprint_r中看到的内容并非总是如此。这对于Simplexml(比较:How to get values of xml elements?; SimpleXML and print_r() - why is this empty?)尤其如此,对于PHP中使用ArrayAccess__toString()或{{3}的其他对象也是如此} / IteratorIterator

如果能回答你的问题,请告诉我。你不是很清楚到目前为止你还没有明白哪些现有的解决方案,所以我回答了你的问题,但如果我发现这个问题,我不是100%。