我有一个非常长的XML,我在PHP中使用simplexml_load_string
来处理它。我面临一种非常奇怪的行为。
这是XML,我已经缩短了这个令人不安的部分。
<?xml version="1.0" encoding="UTF-8"?>
<test><Customer></Customer><Comments><CustomerComment></CustomerComment></Comments></test>
我将此值保存为string
。这是我的PHP代码。
$xml = '<?xml version="1.0" encoding="UTF-8"?>
<test><Customer></Customer><Comments><CustomerComment></CustomerComment></Comments></test>';
$xml = simplexml_load_string($xml);
var_dump($xml);
这是输出
object(SimpleXMLElement)#1 (2) {
["Customer"]=>
object(SimpleXMLElement)#2 (0) {
}
["Comments"]=>
object(SimpleXMLElement)#3 (1) {
[0]=>
object(SimpleXMLElement)#4 (0) {
}
}
}
我不知道,这个简单的代码有什么问题,以及为什么它无法维护子名CustomerComment
。谷歌搜索了很多,找不到任何相关的东西。
关于它,这是奇怪的。我已从XML树的根目录中删除了Customer
子项,并且正确地获取了子名称。
php > $xml = '<?xml version="1.0" encoding="UTF-8"?>
php ' <order><Comments><CustomerComment></CustomerComment></Comments></order>';
php > $xml = simplexml_load_string($xml);
php > var_dump($xml);
object(SimpleXMLElement)#1 (1) {
["Comments"]=>
object(SimpleXMLElement)#3 (1) {
["CustomerComment"]=>
object(SimpleXMLElement)#2 (0) {
}
}
}
现在实际奇怪的部分是,如果我按照以下
打破XML树<?xml version="1.0" encoding="UTF-8"?>
<order>
<Customer></Customer>
<Comments>
<CustomerComment></CustomerComment>
</Comments>
</order>
这是var_dump
。
object(SimpleXMLElement)#1 (2) {
["Customer"]=>
object(SimpleXMLElement)#3 (0) {
}
["Comments"]=>
object(SimpleXMLElement)#2 (1) {
["CustomerComment"]=>
object(SimpleXMLElement)#4 (0) {
}
}
}
获取正确的子名称,但XML与第一个示例相同(换行符除外)
请有人指出,这里有什么问题?以及可以做些什么来解决这个问题。我猜测问题是在一行中使用相同的子名称(此时为Customer
)。
我能想到的唯一可能的解决方法是在我的XML字符串中用>
替换>\n
。
答案 0 :(得分:0)
重要的是要认识到 SimpleXML不会将您的XML转换为对象的数组或层次结构。与DOM一样,SimpleXML是一个 API ,用于访问您的XML(但更好的一个可以使用!);因此,使用var_dump
或盲目转换为JSON,将无法提供有用的结果。相反,使用SimpleXML提供的API从XML文档中提取您实际需要的数据。
在这种情况下,您会发现作为API ,$xml->Comments->CustomerComment
和$xml->Comments[0]->CustomerComment
都会返回相同的元素(如果您不这样做,这很棒)事先知道某人是否要添加第二个Comments
元素。转储输出(或转换为平面数组)时,SimpleXML必须猜测向您展示哪一个。似乎某些版本的PHP有一个错误,它显示0
而不是直接跳到CustomerComment
,但简单的事实是你不应该依赖于此< / strong>,只需访问您知道所需的节点。