2013-02-14 124 views
1

我正在從一個API,我有工作,則下列返回。但是使用SimpleXML我無法訪問的值:PHP的SimpleXML解析問題

<?xml version="1.0" encoding="utf-16"?> 
<Response Version="1.0"> 
    <DateTime>2/13/2013 10:37:24 PM</DateTime> 
    <Contact_ID>151-233-DD</Contact_ID> 
    <Quote_ID>ojc332-ewied-23e3ed</Quote_ID> 
    <Status>Failure</Status> 
    <Reason>Incorrect Contact ID</Reason> 
</Response> 

我設置此功能有:

$variable = new SimpleXMLElement($results); 

SimpleXML的是給我下的,而不是我所期望的是 $可變>日期時間:

SimpleXMLElement Object ([0] => 2/13/2013 10:37:24 PM 151-233-DD 0jc332-ewied-23e3ed Failure Incorrect Contract ID) 

非常感謝任何幫助

+0

as @Rikesh提到*標有UTF-16的文件,但有UTF-8內容* – 2013-02-14 07:02:39

回答

6

似乎編碼類型的原因utf-16,而內容有utf-8

所以,你需要改變你的編碼類型,

$string = '<?xml version="1.0" encoding="utf-16"?> 
    <Response Version="1.0"> 
    <DateTime>2/13/2013 10:37:24 PM</DateTime> 
    <Contact_ID>151-233-DD</Contact_ID> 
    <Quote_ID>ojc332-ewied-23e3ed</Quote_ID> 
    <Status>Failure</Status> 
    <Reason>Incorrect Contact ID</Reason> 
</Response>'; 
$xml = simplexml_load_string(preg_replace('/(<\?xml[^?]+?)utf-16/i', '$1utf-8', $string)); 

Codepad DEMO

此外,它可以使用utf8_encode完成,

$xml = simplexml_load_string(utf8_encode($string)); 
+1

感謝您的幫助。實際上我只是使用utf8_encode($ result)對調用的結果進行編碼,並且一切都很好。 – Nikon0266 2013-02-14 08:22:48

+0

@ Nikon0266 - 也可以選擇。歡迎:) – Rikesh 2013-02-14 08:24:00

+0

其實我認爲這是半夜妄想..我認爲這是工作,但它不是.. 所以我已經縮小到一切格式正確,直到我試圖加載它與SimpleXML。然後我回來只: SimpleXMLElement對象([0] => 2/13/2013 10:37:24 PM 151-233-DD 0jc332-ewied-23e3ed失敗錯誤的合同ID) 我無法單獨訪問這些元素..我迷失在此.. 但是,如果我從結果創建一個字符串並加載它很好..只有當我使用curl返回的變量。 – Nikon0266 2013-02-14 20:31:30

0

你正在建設一個只有XML元素(提示類的名稱)。您需要將整個字符串作爲XML文檔加載。這裏是:

<?php 

$result= <<<XML 
<?xml version="1.0" encoding="utf-8"?> 
<Response Version="1.0"> 
    <DateTime>2/13/2013 10:37:24 PM</DateTime> 
    <Contact_ID>151-233-DD</Contact_ID> 
    <Quote_ID>ojc332-ewied-23e3ed</Quote_ID> 
    <Status>Failure</Status> 
    <Reason>Incorrect Contact ID</Reason> 
</Response> 
XML; 

$dom= new DOMDocument(); 
$dom->loadXML($result, LIBXML_NOBLANKS); 

然後,您可以使用DOM接口來訪問文檔中的各個組件。

例如

$dates = dom->getElementsByTagName('DateTime'); 

這將獲取一個包含所有DateTime元素的數組。

EDIT

糟糕 - $dates將是DOMNodeList的對象。

然後,您可以使用各種方法訪問節點並獲取屬性。

+0

我確實給了這個嘗試..但是我從dom說「DOMNodeList類的對象」的錯誤。如上所述,如果我創建一個結果字符串並加載它,它就可以正常工作。但是如果我使用Curl返回的變量,我會得到這個錯誤。 – Nikon0266 2013-02-14 20:34:19