Есть ли модуль Perl, который проверяет XML на соответствие схеме?

Мне нужно проверить XML вместо схемы.

Я пробовал XML :: SAX :: ParserFactory; XML :: Validator :: Schema и связанные модули, но похоже, что они ограничены.
Ограничено в том смысле, что он не распознал элементы схемы, такие как xsd: unique, xsd: group, xsd: keyref, xsd: union и xsd: ключ.

Это xsd: unique и др. Новые дополнения?

Буду признателен, если вы можете указать мне на некоторые модули Perl, которые обновлены и соответствуют задаче.

Заранее спасибо.


person Thushan    schedule 26.11.2008    source источник


Ответы (3)


Вы пробовали проверить это с помощью xmllint?

person JDrago    schedule 26.11.2008
comment
Инструмент командной строки xmllint работает очень хорошо. Спасибо, JDrago! - person Thushan; 27.11.2008

Взгляните на XML :: LibXML

При этом используется широко известная библиотека libxml2, которую большинство людей называют преемником Expat и XML :: Parser на основе модулей.

Для проверки схемы посмотрите XML :: LibXML :: Schema

use XML::LibXML;
use XML::LibXML::Schema;

my $schema = XML::LibXML::Schema->new(location => 'file.xsd' );
my $parser = XML::LibXML->new;

my $xml    = 'file.xml';
my $doc    = $parser->parse_file( $xml );

eval { $schema->validate( $doc ) };
die $@ if $@;

say "$xml is valid\n";

NB. Я по-прежнему в основном являюсь пользователем XML :: Twig и почти не касаюсь схемы XML, поэтому я не Не знаю, решит ли XML :: LibXML :: Schema вашу проблему, но, возможно, это лучшее решение на CPAN для ваших нужд.

person draegtun    schedule 27.11.2008

@Thushan Вам абсолютно необходимо использовать Perl? Если нет, почему бы не попробовать XMLSTARLET? Это неплохой набор инструментов для работы с XML в терминале!

Он поддерживает не только устаревшие DTD и XSD, как вам нужно, но также поддерживает схемы Relax-NG. Ознакомьтесь с его документацией, чтобы узнать, как проверять XML-документы с помощью xmlstarlet I надеюсь, это поможет вам;)

Хорошего дня!

П.Д. О, я вижу, вы использовали xmllint! Это тоже здорово, но я предпочитаю xmlstarlet =) Попробуйте;)

person Metafaniel    schedule 17.02.2012
comment
В xmllint хорошо то, что он использует ту же библиотеку, что и XML :: LibXML, поэтому, когда я хочу сделать что-то более сложное, чем одна команда xmllint, я могу легко переключиться на Perl. Я использую xmlstarlet для простых преобразований XML. - person reinierpost; 27.05.2014