2013-02-25 2 views
-1

Я получил этот XML из запроса curl.Игнорировать недопустимый символ вне XML?

<?xml version="1.0" encoding="utf-8"?> 
<transaction> 
    <result>PENDING</result> 
    <merchanttransid>343434343</merchanttransid> 
    <transref>23232323</transref> 
    <errorcode>000</errorcode> 
    <errormessage/> 
    <description/> 
</transaction> 
SMTP Error: Could not connect to SMTP host. 

Однако сервер отвечает дополнительным ответом на ошибку SMTP Ошибка: не удалось подключиться к узлу SMTP. Теперь при анализе через simplexml_load_string().

Это бросить это ошибка:

Entity: line 10: parser error: Extra content at the end of the document (Error Number: 2)

В виду того что XML является правильным и просто имея вопрос на ответ, есть способ, как полоса, что дополнительные линии?

+1

Лучшее решение - попросить создателя службы исправить это. – CodeZombie

+0

Неверный XML. Вот почему SimpleXML здесь дает ошибку. Если вы хотите загрузить его, тем не менее, вам нужно использовать библиотеку-сестер * DOMDocument * с функцией восстановления, установленной в true. См. [Этот ответ в * «Исправить неверный XML в PHP перед обработкой с использованием функций DOMDocument» * (http://stackoverflow.com/a/9281963/367456). – hakre

ответ

0

Вы можете попытаться вызвать функцию передавая ему параметры игнорировать сообщения об ошибках чтения XML:

$xml = simplexml_load_file($url, "SimpleXMLElement", LIBXML_NOERROR | LIBXML_ERR_NONE); 

Вы можете увидеть полный список с параметрами, которые вы можете передать в эту функцию: http://www.php.net/manual/en/libxml.constants.php

Другое решение (это не очень хорошо, если вы хотите разобрать большие файлы) - читать символы по строкам, а затем удалять последнюю строку.

$xml = '<?xml...?>'; 
$lines = explode("\n", $xml); 
unset($lines[count($lines)-1]); // remove last line 
$output = implode($lines); // output now contains xml without the last line 

Надеюсь, что это поможет.

+0

Второй пример удалит последнюю строку, даже если нет ошибки. – Voitcus

+0

Да, тогда мы можем объединить ваше решение с этим, просто проверить, чтобы убедиться, что в последней строке нет открытого тега. :-) – vitozev

0

Если вы знаете, что структура будет всегда такой, цикл для каждой строки, полоса пробелов слева и если первый символ отличается от «<», тогда удалите строку. В конце дайте результат SimpleXML.

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