2

我有一小块希望在 PHP 中解析的 XML。标签没问题,Works我可以解析所有属性就好了。我遇到的问题是Doesnt标签,似乎因为它具有我无法访问属性的文本内容。

<Export id="123" apples="pears">
    <Works foo="bar" id="234"/>
    <Doesnt bar="foo" id="345">Stack Exchange</Doesnt>
</Export>

我运行以下(非常简单的)代码:

$plain = '<Export id="123" apples="pear....esnt></Export>'; // as above
$sxe = simplexml_load_string($plain);
$json = json_encode($sxe);
$native = json_decode($json);
print_r($sxe, true);
print_r($native, true);

我最终得到以下输出:

SimpleXMLElement Object
(
    [@attributes] => Array
        (
            [id] => 123
            [apples] => pears
        )
    [Works] => SimpleXMLElement Object
        (
            [@attributes] => Array
                (
                    [foo] => bar
                    [id] => 234
                )
        )
    [Doesnt] => Stack Exchange
)

stdClass Object
(
    [@attributes] => stdClass Object
        (
            [id] => 123
            [apples] => pears
        )

    [Works] => stdClass Object
        (
            [@attributes] => stdClass Object
                (
                    [foo] => bar
                    [id] => 234
                )

        )

    [Doesnt] => Stack Exchange
)

如您所见,SimpleXMLElement对象和stdClass对象都缺少<Doesnt>标签的所有属性。是否有一些解决方法或替代方法来解决它们?

4

1 回答 1

2

正如@Gordon 所说,您无法通过print_rand了解全部情况var_dump:SimpleXMLElement Object具有一些不寻常的属性,因此这些转储函数将无法正确表示其结构。

不过,如果您改用它:

$sxe = simplexml_load_string($plain);
var_dump($sxe->Doesnt);

...您会看到这些属性及其值完好无损。

但仔细看看输出:

object(SimpleXMLElement)[3]
  public '@attributes' => 
    array (size=2)
      'bar' => string 'foo' (length=3)
      'id' => string '345' (length=3)
  string 'Stack Exchange' (length=14)

这有点不寻常,你不觉得,string只是挂在那里有价值——没有任何相应的财产拥有它吗?但这正是直接转换成问题的原因。JSON(原样)处理简单的结构——对象和数组——并且这种结构不能在它们中正确表示:您至少必须引入一些额外的属性来存储文本内容。

不过,这种方法似乎很受欢迎(在某种程度上),而且您肯定并不孤单:这是 PHP 错误跟踪系统中的一张公开

于 2012-11-05T11:16:33.740 回答