0

我已经多次看到这个问题,并希望得到明确的答案。

给定 xml 中的这种结构:

<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>

我无法访问属性“订单”。var_dump(不出所料)不显示 ByteListSet 的任何属性。实际上,foreach 迭代不会产生 @attributes 项。

但是,以下结构:

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

正确地导致 ByteListSet 有一个子 Byte,它是一个具有 @attributes 的 SimpleXmlObject。

我会假设 SimpleXML 确实从第一个案例中获取了@attributes,但是它将它们保留在哪里?问题在于,在前一个结构中,ByteListSet 在 ->children() 的 var_dump 上生成:

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

如果我对它进行 get_object_vars() 和 var_dump ,我只会得到:

string '14' (length=2)

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

Order="0" 在某处,但我无权访问它。我怎么去呢?注意: ->attributes() 如您所料,返回一个空白数组。

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

4

1 回答 1

0

你写了:

给定 xml 中的这种结构:

<ByteListSet>
    <Byte Order="0">14</Byte>
</ByteListSet>

我无法访问属性“订单”。

当然,因为该属性order不存在。XML 区分大小写,属性以Order大写O开头。

使用正确的属性名称,您可以在手册中找到的 SimpleXML 扩展的基本示例中的示例 #5 中访问值作为大纲:

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

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

请记住,您所看到的var_dumpprint_r并不总是您所得到的。这对于 Simplexml 尤其如此(比较:如何获取 xml 元素的值?SimpleXML 和 print_r() - 为什么这是空的?),但是,对于 PHP 中使用ArrayAccess,__toString()IteratorIterator/的其他对象也是如此IteratorAggregate

请让我知道这是否回答了您的问题。你不是很具体,到目前为止你还没有理解哪些现有的解决方案,所以我回答了你的问题,但如果我一针见血,我不是 100%。

于 2013-01-28T16:42:45.493 回答