从字符串

时间:2015-11-18 13:51:38

标签: php simplexml

我有一个非常长的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

1 个答案:

答案 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>,只需访问您知道所需的节点。