PHP SimpleXML元素解析问题

时间:2013-02-16 00:45:10

标签: php xml xml-parsing simplexml

我遇到了一个奇怪但显然有效的XML字符串,我正在通过API返回。我一直在使用SimpleXML解析XML,因为将它传递给函数并将其转换为方便的数组非常容易。

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库?

2 个答案:

答案 0 :(得分: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..."
}

答案 1 :(得分:0)

您已使用SimpleXML解析XML。我想你想把它解析成一个你没有进一步定义的方便的数组。

您遇到的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?