2013-02-16 2 views
0

Я столкнулся с странной, но, видимо, корректной строкой XML, которую я возвращаю API. Я анализировал XML с помощью SimpleXML, потому что очень легко передать его функции и преобразовать в удобный массив.Проблема простого синтаксического анализа 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

Проблема оказалась в том, что я деконструировал ее с помощью функции get_object_vars() php. Это работает в 90% случаев, но в этом случае дроссели из-за того, как SimpleXML хранит данные. Таким образом, не ошибка SimpleXML и ручное пересечение этого будет делать трюк. –

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 demo и How to parse and process HTML/XML with PHP?.

Смежные вопросы