Не удается прочитать XML-файл с помощью simplexml_load_string - PullRequest
1 голос
/ 02 октября 2011

Я пытался прочитать XML-файл, но он дает мне странную ошибку. Мой XML выглядит следующим образом

<?xml version='1.0' encoding='UTF-8'?>
<response>
    <url>http://xyz.com</url>
    <token>xxxxxxx<token>
</response>

Чтобы прочитать это, я использую

simplexml_load_string(variable containing xml goes here)

но это дает мне эту ошибку

Предупреждение: simplexml_load_string () [function.simplexml-load-string]: Объект: строка 1: ошибка синтаксического анализатора: ожидается начальный тег, '<' не найден в по линии 47 </p>

Предупреждение: simplexml_load_string () [function.simplexml-load-string]: 1 на линии 47

Предупреждение: simplexml_load_string () [function.simplexml-load-string]: ^ на линии 47

Ответы [ 3 ]

4 голосов
/ 03 октября 2011

Спасибо всем за внимание и ответы, но проблема кроется где-то еще. В моем запросе curl я не установил для CURLOPT_RETURNTRANSFER значение true, что приводило к тому, что XML не записывался в переменную, и каким-то образом печатался наэкран, дающий иллюзию, что это происходит от переменной, но это не так.Однако я установил CURLOPT_RETURNTRANSFER на 1, и теперь он дает мне правильные результаты.Извините за глупую ошибку.и спасибо всем.

3 голосов
/ 02 октября 2011

Ответ, который вы получаете от API, не является правильно сформированным / действительным XML:

<token>xxxxxxx<token>
              ^ missing /

Поскольку это ответ API, вам нужно исправить его, прежде чем simplexml сможет его прочитать. Вы можете использовать аккуратное расширение Документы чтобы решить эту проблему:

$config = Array(
    'input-xml' => 1,
);
$xml = tidy_repair_string($xml, $config);

$xmlObj = simplexml_load_string($xml);

$doc = dom_import_simplexml($xmlObj)->ownerDocument;

$xpath = new DOMXpath($doc);

foreach($xpath->query('//token[not(node())]') as $node)
{
    $node->parentNode->removeChild($node);
}

echo $xmlObj->asXML();

Это создаст следующий XML-код, сначала исправив незакрытые теги, а затем удалив пустые token элементы:

<?xml version="1.0" encoding="utf-8"?>
<response>
<url>http://xyz.com</url>
<token>xxxxxxx
</token>
</response>

Связанный:

0 голосов
/ 04 октября 2016

Как вы правильно заметили, значение CURLOPT_RETURNTRANSFER, равное 1, очень важно!

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $postUrl);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0 ); // set to 1 for debugging
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return from sms server
...