2015-11-19 62 views
0

在PHPsimplexml_load_string给出不一致的XML标签

$str = '<?xml version="1.0"?><toplevel><CompleteSuggestion><suggestion data="google"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google maps"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google translate"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google docs"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google drive"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google classroom"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google news"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google earth"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google flights"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google calendar"/></CompleteSuggestion></toplevel>'; 
$xml = simplexml_load_string($str); 
$data = json_decode(json_encode($xml),true); 
echo "ARRAY: <pre>"; 
var_dump($data); 

与简单的XML解析XML字符串时,在上述情况下,我得到不一致的XML标签,我使用的是从谷歌的自动完成功能,并将其与内建议作出回应CompleteSuggestions标记。看看php数组,我得到一个包含10个项目的CompleteSuggestion数组。前9个键有[0]键,而最后一个键有'[建议]键。这对我来说很奇怪。

任何一个人知道为什么简单的XML做到这一点?我怎样才能解决它,或解析它,因为我的foreach得到了一个偏移错误。谢谢!

+0

您正在使用什么版本的PHP?上5.6的结果为[ “CompleteSuggestion”=> [/ * 10个*元件/]的数组] –

+0

PHP 5.5。我也越来越10个元素的数组但这是每个元素与不同的密钥 – Dan

+1

阵列中的问题,为什么,为什么,为什么,你的SimpleXML的对象转换为一个数组,并扔掉了SimpleXML的所有有用的位API? 'foreach($ xml-> CompleteSuggestion为$ comp_suggestion){$ suggestion = $ comp_suggestion-> suggestion; echo $ suggestion ['data']; }' – IMSoP

回答

0

这是一个奇怪的一个 - 我得到的5.6相同的行为(从1开始的数字阵列为所有这些分开)。

作为一种变通方法,我用array_pop:

<?php 

$str = '<?xml version="1.0"?><toplevel><CompleteSuggestion><suggestion data="google"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google maps"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google translate"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google docs"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google drive"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google classroom"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google news"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google earth"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google flights"/></CompleteSuggestion><CompleteSuggestion><suggestion data="google calendar"/></CompleteSuggestion></toplevel>'; 
$xml = simplexml_load_string($str); 

$data = json_decode(json_encode($xml),true); 


foreach ($data['CompleteSuggestion'] as $suggestion){ 
     $sug = array_pop($suggestion); 

     echo $sug['@attributes']['data'] . "<br />"; 
} 
+0

哦,很酷。这非常整齐。 – Dan

+0

下面是相同的代码通过使用SimpleXML如预期,而不是一个数组黑客简化:https://3v4l.org/PTgjh – IMSoP

0

那是非常有趣的现象。我想,这是因为你有你的XML中的多个suggestion标签和SimpleXML尝试解析这个XML作为与命名suggestion场中的目标,然后当分析器满足另一个同名的标签认为对象转换为数组。

,所以我不会依靠内置的SimpleXML数据结构,并建议更换你预处理接收到的数据作为利亚姆建议。

+1

一切都非常有趣的设想,但没有真正的SimpleXML是如何工作的。 SimpleXML的实际上并不在所有解析整个文档转换为对象和数组提前,它只是给你访问底层的文件与面向对象的接口,像DOM一样。 – IMSoP

+0

谢谢你的回复。也许你知道为什么SimpleXML对象以这种有趣的方式转换为xml?我只是好奇。 – max

+1

好,因为[它在不同的版本具有不同的行为(https://3v4l.org/DGYJP)我会说这只是一个错误。需要注意的是它绝对没有任何关系的SimpleXML如何读取XML本身,而是它是如何转换成JSON,它始终将是混乱的,因为JSON和XML仅仅是根本不同的结构化数据的方式。 – IMSoP