Раздел 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>


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

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&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 был интерпретирован как разделитель для следующего параметра. Поэтому, когда я сбежал от этого Чара, он начал работать должным образом.

Comments

    Ничего не найдено.