XmlReader сообщает о «Дополнительном содержимом в конце документа» в почти пустом XML-файле

#php #xml #parsing #xmlreader

#php #xml #синтаксический анализ #xmlreader

Вопрос:

У меня возникли проблемы с использованием XmlReader на нашем живом сервере, в то время как на наших серверах разработки все работает гладко. XmlReader всегда выдает «ошибка синтаксического анализатора: дополнительное содержимое в конце документа» при чтении XML-файла. Независимо от того, содержит ли он тысячи элементов или только одну строку.

 $reader = new XMLReader();
$reader->open($xmlFileName, 'UTF-8');
while ( $reader->read() ) { ... do nothing ... }
$reader->close();
  

XML выглядит следующим образом в своей самой простой форме:

 <?xml version="1.0" encoding="UTF-8"?>
<data><articles><![CDATA[test]]></articles></data>
  

Каждый валидатор xml говорит, что он правильно сформирован, но ошибки все равно выдаются.

Единственное различие, которое я могу заметить между нашей разработкой и нашей действующей системой, заключается в том, что наша система разработки (Ubuntu) имеет версию libxml2 2.7.16, в то время как действующая система (CentOS) имеет 2.6.16. Может ли это быть причиной?

Комментарии:

1. Что показывает шестнадцатеричный дамп XML-файла (ie. есть ли невидимое содержимое в конце)?

2. Установлена ли библиотека производственного сервера и среда PHP с использованием RPM или смонтирована и загружена в него? Другими словами, вы создаете «php-xml» вручную или используете RPM?

3. Может ли быть так, что ваш реальный XML имеет несколько корневых элементов?

4. Doh… Это не имеет ничего общего с XmlReader или libxml. XML-файл, который я читаю, сгенерирован XmlWriter за несколько секунд до этого, и там отсутствовал окончательный XmlWriter-flush(), который завершает структуру xml. Я не знаю, почему это никогда не появлялось в моей системе разработки, но теперь все работает так, как ожидалось.

Ответ №1:

Проблемой всегда могут быть разные версии, хотя это может не отвечать на то, в чем проблема, а только на то, какое решение вам может понадобиться.

Я с подозрением отношусь к вашей обработке CDATA (попробуйте использовать пробелы вокруг содержимого, so) и, кажется, помню некоторые старые ошибки в отношении обработки CDATA в вашей довольно старой рабочей версии, а также, действительно ли у вас работает UTF-8 (некоторые библиотеки чувствительны к символам и настройкам по умолчанию, например, ручные переопределения игнорируются, если установлена правильная настройка. Кроме того, является ли ‘-‘ в ‘UTF-8’ em-тире, обычным тире или каким-либо другим тире?)

Кроме того, попробуйте опубликовать свой реальный XML, даже в шестнадцатеричном дампе, но я, кажется, припоминаю, что кодировки символов для UTF-8, рассматриваемые как что-то другое, создадут дополнительные символы (которых на самом деле там нет).