Parsed SimpleXMLElement缺少属性

时间:2012-11-05 11:09:49

标签: php xml simplexml

我希望在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>标记的所有属性。 是否有一些解决方法或替代手段?

1 个答案:

答案 0 :(得分:2)

正如@Gordon所说,你没有得到print_rvar_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错误跟踪系统中的 open ticket