Когда я использую DOMDocument :: loadXML () для моего XML ниже, я получаю ошибку:
Warning: DOMDocument::loadXML() [domdocument.loadxml]: CData section not finished http://www.site.org/displayimage.php?album=se in Entity, Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag image line 7 in Entity Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag quizz line 3 in Entity Warning: DOMDocument::loadXML() [domdocument.loadxml]: Premature end of data in tag quizzes line 2 in Entity Fatal error: Call to a member function getElementsByTagName() on a non-object
Мне кажется, что мои разделы CData закрыты, но все же я получаю эту ошибку. XML выглядит так:
<?xml version="1.0" encoding="utf-8"?> <quizzes> <quizz> <title><![CDATA[Title]]></title> <descr><![CDATA[Some text here!]]></descr> <tags><![CDATA[one tag, second tag]]></tags> <image><![CDATA[http://www.site.org/displayimage.php?album=search&cat=0&pos=1]]></image> <results> <result> <title><![CDATA[Something]]></title> <descr><![CDATA[Some text here]]></descr> <image><![CDATA[http://www.site.org/displayimage.php?album=search&cat=0&pos=17]]></image> <id>1</id> </result> </results> </quizz> </quizzes>
Не могли бы вы помочь мне выяснить, в чем проблема?
Я обнаружил, что обычно возникают проблемы со скрытыми символами XML, поэтому я предпочитаю избегать недопустимых символов, таких как любимые:
<?php //$feedXml is the fetched XML content $invalid_characters = '/[^\x9\xa\x20-\xD7FF\xE000-\xFFFD]/'; $feedXml = preg_replace($invalid_characters, '', $feedXml );
Извините, если это отключено, потому что это связано только с конкретным случаем с PHP при использовании cURL, но, как и для состояний tomaszs, я также обнаружил, что амперсанды могут вызвать проблему при передаче XML через cURL в PHP. Я получал известную допустимую строку XML с правильно закодированными амперсандами и затем перенаправлял ее на другой адрес cURL. Что-то вроде этого…
$curlHandle = curl_init(); curl_setopt($curlHandle, CURLOPT_URL, $fullUri); curl_setopt($curlHandle, CURLOPT_HEADER, false); curl_setopt($curlHandle, CURLOPT_RETURNTRANSFER, true); curl_setopt($curlHandle, CURLOPT_CONNECTTIMEOUT, 4); // seconds curl_setopt($curlHandle, CURLOPT_POST, true); curl_setopt($curlHandle, CURLOPT_POSTFIELDS, "xmlstr=" . $xmlstr); // Problem
Проблема возникает в последней строке выше при добавлении XML в CURLOPT_POSTFIELDS. Первый закодированный амперсанд рассматривается как разделитель для параметра, как в строке запроса, а переменная / поле «xmlstr» усекается.
Решение, которое я использовал, это заменить последнюю строку выше …
curl_setopt($curlHandle, CURLOPT_POSTFIELDS, "xmlstr=" . urlencode($xmlstr));
Надеюсь, это поможет кому-то.
В ответах здесь есть правильная идея: в документе есть какой-то плохой, возможно непечатаемый характер, который разбивает парсер. Ни один из ответов выше не решил мою проблему, вместо этого я использовал tr
для записи «чистой» версии файла, а затем я смог разобрать это,
<?php try { $simpleXMLobject = simplexml_load_file($feed); } catch (\Exception $ex) { //try to clean the file and reload it $tempFile = sys_get_temp_dir() . "/" . uniqid("rdc"); shell_exec( "tr -cd '\11\12\15\40-\176' < " . escapeshellarg($feed) . " > " . escapeshellarg($tempFile) ); try { $simpleXMLobject = simplexml_load_file($tempFile); } catch (\Exception $ex) { $err = $ex->getTraceAsString(); echo die($err); } }
Я не вижу никакой ошибки (либо фактически используемый XML отличается от предоставленного, либо используемого процессора xml (BTW, что это?) Является ошибкой).
Я бы рекомендовал избегать использования разделов CDATA. Используйте следующий XML-документ , который совпадает с (эквивалентным текстом) предоставленному и более читаемым:
<quizzes> <quizz> <title>Title</title> <descr>Some text here!</descr> <tags>one tag, second tag</tags> <image>http://www.site.org/displayimage.php?album=search&cat=0&pos=1</image> <results> <result> <title>Something</title> <descr>Some text here</descr> <image>http://www.site.org/displayimage.php?album=search&cat=0&pos=17</image> <id>1</id> </result> </results> </quizz> </quizzes>
-<quizzes> <quizz> <title>Title</title> <descr>Some text here!</descr> <tags>one tag, second tag</tags> <image>http://www.site.org/displayimage.php?album=search&cat=0&pos=1</image> <results> <result> <title>Something</title> <descr>Some text here</descr> <image>http://www.site.org/displayimage.php?album=search&cat=0&pos=17</image> <id>1</id> </result> </results> </quizz> </quizzes>
Я обнаружил, что проблема заключалась в передаче этого XML в PHP с помощью cURL. Я отправил его как обычный текст, а & char в этом XML интерпретировался как разделитель на следующий параметр. Поэтому, когда я избежал этого символа, он начал работать правильно.