Проверка XML-схемы с помощью RelaxNG

Какие инструменты проверки XML вы можете порекомендовать с точки зрения производительности и точности, каждый из которых является критической проблемой в нашей системе? У нас есть следующие требования:

  • Это не xmllint (см. ниже)
  • Поддерживает RelaxNG
  • Может легко интегрироваться с Perl (это необязательно, но было бы неплохо)

Почему не xmlint? (Это фон, и вы можете пропустить его, если хотите)

У нас есть большая система Perl, которая использует RelaxNG для проверки нашего XML. Мы используем компактный формат RelaxNG и trang, чтобы преобразовать его в стандартный формат RelaxNG. Затем мы выполняем фактическую проверку через xmllint.

Вот когда начинаются проблемы. xmllint обычно имеет проблемы с неправильным сообщением об ошибках проверки. Он не дает ложных положительных или отрицательных результатов, но если документ не проходит проверку, xmllint часто сообщает о неправильном элементе или атрибуте для данной ошибки. Иногда ошибка верна («не ожидал увидеть элемент «bar»), но только потому, что о предыдущей ошибке не сообщалось (поскольку «bar» должен был следовать за обязательным, но отсутствующим элементом «foo», но xmllint не не говорите нам об этом). Обратите внимание, что это давняя проблема с xmllint, и даже в последней версии есть те же проблемы. У нас часто есть огромные XML-документы, и неправильное сообщение об ошибках причиняет много страданий как клиентам, так и разработчикам.


person Ovid    schedule 03.11.2008    source источник
comment
Поскольку это было задано более 7 лет назад (сейчас 2015 год): xmlint все еще слишком глючит для вашей цели?   -  person Jens    schedule 12.01.2015
comment
Йенс: это было на BBC, и я не работал там много лет, и с тех пор я не использовал xmllint.   -  person Ovid    schedule 13.01.2015


Ответы (5)


Я думаю, что у JDrago правильная идея, что вам нужно избегать инструментов на основе libxml2 для проверки ГСЧ, по крайней мере, сейчас. Я также обнаруживаю это в своем проекте. Недавно я зарегистрировал две ошибки в libxml2, касающиеся проверки ГСЧ.

Я рекомендую цзин. Он был написан Джеймсом Кларком, создателем Relax NG и одним из ведущих специалистов в мире XML. Он также является автором trang, которым вы уже пользуетесь. Разработка этого кода (и trang) недавно возобновилась на сайте Google Code, на который я ссылаюсь выше.

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

Единственный недостаток jing по сравнению с libxml2/xmllint заключается в том, что в настоящее время он не использует XML-каталоги OASIS для разрешения общедоступных и системных идентификаторов и URI, указывающих на схемы. Это может быть проблемой, если вы включили схемы, на которые ссылается URI «http» — они всегда будут загружаться по сети.

person ChuckB    schedule 03.11.2008

Схема Hamcrest позволяет проверять XML-документы на соответствие RelaxNG с помощью Hamcrest Matchers.

person Wilfred Springer    schedule 11.01.2010

Я подозреваю, что xmlint использует те же базовые библиотеки (libxml2 и т. д.), что и все остальное. Нелогично думать, что другой интерфейс к той же библиотеке даст другие результаты.

person JDrago    schedule 03.11.2008

rnv работает очень быстро, бесплатно (как и в случае со свободой слова) и работает в командной строке (поэтому Perl может легко вызвать его). В большинстве случаев сообщения в порядке. К сожалению, кажется, больше не поддерживается.

person bortzmeyer    schedule 23.12.2008

Я автор РНВ. Он поддерживается на sourceforge.net, и есть сопровождающий, который заботится о сборке пакетов как для sourceforge, так и для debian. Дело в том, что код не меняется из-за того, что код стабилен. Сообщений об ошибках нет.

person Community    schedule 23.12.2008
comment
Это явно не так. Например, ошибка xsd:anyURI, о которой я сообщил в феврале 2006 года, была полностью проигнорирована. Ошибка в том, что URI с @ или , например lemonde.fr/web/article/ ошибочно отклонены. w3.org/TR/xmlschema-2/#anyURI - person bortzmeyer; 23.12.2008