2013-02-16 86 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?