2015-11-19 84 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