Недавно моя Fedora 16 автоматически обновила libxml2 с предыдущей версии до последней версии rpm libxml2-2.7.8-8.fc16.i686, и внезапно проверка dtd начинает жаловаться на отсутствующие объявления в файле DTD. До этого обновления все работало нормально. И, конечно же, когда я отключаю проверку, она также работает нормально, но это не идея. Я не использую libxml2 напрямую, на самом деле я использую libxml ++, который является оболочкой для libxml2.
Я попытался найти некоторые изменения в коде libxml2, которые могут вызвать эту проблему, но последние изменения на сайте libxml2 и изменения на сайте Fedora для этого пакета не упоминают никаких изменений в коде DTD (в последних выпусках)
Сообщение xml, приведенное ниже, неожиданно больше не является действительным:
<?xml version="1.0"?><!DOCTYPE MYAPP SYSTEM "myapp.dtd"><MYAPP><Command type="Connect"/></MYAPP>
Выдает следующие сообщения об ошибках:
No declaration for attribute type of element Command
No declaration for element Command
No declaration for element MYAPP
Вот (раздетый) фрагмент из myapp.dtd, который я использую:
<!ELEMENT MYAPP (Command|Result)>
<!ELEMENT Command (Parameters?)>
<!ELEMENT Parameters (..a lot of other types and records..)>
<!ATTLIST Command type (None|
Connect|
Disconnect
) "None">
У кого-нибудь есть несколько указателей о том, что может внезапно вызвать это, у кого-нибудь есть какие-то указатели / ссылки на изменения в этой версии. Это известная ошибка, какие-либо подсказки ??
Как и предполагалось, я перекомпилировал (последняя версия) libxml2 и без изменений, я также перекомпилировал последнюю версию libxml ++ (2.35-3), теперь он красиво печатает номер строки и столбец ошибки, но это все, что изменилось , Парсер все еще не принимает мой (ранее принятый) XML-файл / сообщение.
Но libxml 2.7.8 (в Windows), который я использую, правильно проверяет ваш файл. Нет сообщений. Сначала жаловались на ..
в третьей строке вашего файла dtd, поэтому мне нужно было удалить эту строку. И теперь это дает чистый вывод.
Так что, возможно, ваше автоматическое обновление действительно испортило библиотеку. Если вы компилируете 2.7.8 из исходного кода, он будет помещен в /usr/local
и переопределит вашу текущую установку. Тогда вы могли бы попробовать еще раз. Я не знаю, как вы могли бы попытаться исправить существующую установку. В любом случае релиз 2.7.8 не несет ответственности за ошибки, которые вы получаете.
Моя тестовая командная строка: xmllint ikku.xml -dtdvalid
Быстрая мысль: возможно, ваш парсер принимает во внимание другой файл dtd из-за некоторых catalog
проблемы. Попробуйте изменить имя файла dtd.
Других решений пока нет …