我希望在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>
标记的所有属性。 是否有一些解决方法或替代手段?
答案 0 :(得分:2)
正如@Gordon所说,你没有得到print_r
和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错误跟踪系统中的 open ticket。