2013-02-16 83 views
0

我遇到了一個奇怪的但顯然是有效的XML字符串,我被API返回。我一直在使用SimpleXML解析XML,因爲將它傳遞給函數並將其轉換爲方便的數組非常簡單。PHP SimpleXML元素解析問題

以下是不正確的SimpleXML解析:在

<?xml version="1.0" standalone="yes"?> 
<Response> 
    <CustomsID>010912-1 
     <IsApproved>NO</IsApproved> 
     <ErrorMsg>Electronic refunds...</ErrorMsg> 
    </CustomsID> 
</Response> 

簡單的XML結果:

SimpleXMLElement Object ([CustomsID] => 010912-1) 

有沒有辦法在XML解析這個?還是另一個返回反映XML結構的對象的XML庫?

回答

1

這是對文本和其他節點的奇怪迴應。如果您手動遍歷它(而不是作爲一個數組,但作爲一個對象),你應該能夠進去:

<?php 
    $xml = '<?xml version="1.0" standalone="yes"?> 
    <Response> 
     <CustomsID>010912-1 
      <IsApproved>NO</IsApproved> 
      <ErrorMsg>Electronic refunds...</ErrorMsg> 
     </CustomsID> 
    </Response>'; 

    $sObj = new SimpleXMLElement($xml); 

    var_dump($sObj->CustomsID); 

    exit; 
?> 

結果第二對象:

object(SimpleXMLElement)#2 (2) { 
    ["IsApproved"]=> 
    string(2) "NO" 
    ["ErrorMsg"]=> 
    string(21) "Electronic refunds..." 
} 
+0

問題原來是我用php的get_object_vars()函數解構它。由於SimpleXML存儲數據的方式,這個例子中90%的時間工作,但在這個例子中有扼流圈。因此,不是SimpleXML的錯誤,並且手動遍歷它將會起到訣竅的作用。 – 2013-02-19 23:35:45

0

你已經解析XML與SimpleXML。我想你想解析它到一個方便的陣列,你沒有進一步定義。

你有XML的問題是它的結構不是很明顯。如果不發生大的變化,則可以使用的SimpleXMLIterator而不是SimpleXMLElement它轉換成一個數組:

$it = new SimpleXMLIterator($xml); 
$mode = RecursiveIteratorIterator::SELF_FIRST; 
$rit = new RecursiveIteratorIterator($it, $mode); 
$array = array_map('trim', iterator_to_array($rit)); 

print_r($array); 

有問題的XML字符串這給:

Array 
(
    [CustomsID] => 010912-1 
    [IsApproved] => NO 
    [ErrorMsg] => Electronic refunds... 
) 

看得那麼清楚online demoHow to parse and process HTML/XML with PHP?