Intereting Posts
php, как перейти на один уровень вверх по dirname (__ FILE__) Преобразование URL-адресов из текста в ссылки, даже если протокол отсутствует Отправьте файл в PHP-скрипт из приложения VB.NET javascript эквивалент PHP-вызова call_user_func () Импорт котировок в vtiger crm с веб-сервисами Как написать REST API? Как я могу разрешить пользователю загружать файл, который хранится за пределами webroot? Как получить случайное значение от 1 ~ N, но исключая несколько конкретных значений в PHP? показать multi select id by js Нечетные разрешения для файла, измененного PHP move_uploaded_file () Передать переменные между двумя страницами PHP без использования формы или URL-адреса страницы Являются ли PHP MySQLi подготовленными запросами с привязанными параметрами? PHRets: использование PHP для загрузки фотографий недвижимости как в случае запроса в zend framework 2 Зависимость от Laravel не может быть получена с помощью композитора. Альтернатива для получения источника L4?

Не удалось завершить работу с 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> 

Не могли бы вы помочь мне выяснить, в чем проблема?

Я обнаружил, что обычно возникают проблемы со скрытыми символами 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&amp;cat=0&amp;pos=1</image> <results> <result> <title>Something</title> <descr>Some text here</descr> <image>http://www.site.org/displayimage.php?album=search&amp;cat=0&amp;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&amp;cat=0&amp;pos=1</image> <results> <result> <title>Something</title> <descr>Some text here</descr> <image>http://www.site.org/displayimage.php?album=search&amp;cat=0&amp;pos=17</image> <id>1</id> </result> </results> </quizz> </quizzes> 

Я обнаружил, что проблема заключалась в передаче этого XML в PHP с помощью cURL. Я отправил его как обычный текст, а & char в этом XML интерпретировался как разделитель на следующий параметр. Поэтому, когда я избежал этого символа, он начал работать правильно.