Раздел CData не закончен проблема
Когда я использую 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>
Не могли бы вы помочь мне выяснить, в чем проблема?
5 ответов:
Я обнаружил, что обычно возникают проблемы со скрытыми XML-символами, поэтому я предпочитаю escape-недопустимые символы, такие как любимый:
<?php //$feedXml is the fetched XML content $invalid_characters = '/[^\x9\xa\x20-\xD7FF\xE000-\xFFFD]/'; $feedXml = preg_replace($invalid_characters, '', $feedXml );
Извините, если это не по теме, потому что это связано только с конкретным случаем с PHP при использовании cURL, но, как утверждает Томаш, я тоже обнаружил, что амперсанды могут вызвать проблему при передаче 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-процессор (кстати, что это?) глючит).
Я бы рекомендовал избегать использования разделов 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>
Я обнаружил, что проблема заключалась в передаче этого XML в PHP с помощью cURL. Я отправил его как обычный текст, и & char в этом XML был интерпретирован как разделитель для следующего параметра. Поэтому, когда я сбежал от этого Чара, он начал работать должным образом.
Comments