Validace XML v Perlu

Honza Pazdziora adelton na fi.muni.cz
Pátek Říjen 19 11:07:45 CEST 2007


On Mon, Oct 15, 2007 at 11:37:43PM +0200, Jan Kasprzak wrote:
> 
> ne ze by mi to bylo prijemne, ale musim zase po nejake dobe zpracovavat
> v Perlu data v XML. Prislo mi ze pro zpracovani dat je XML::Simple::XMLin()
> presne to co potrebuju, akorat by bylo dobre ta data predem nejak
> zvalidovat, ze maji zhruba takovou strukturu jako ocekavam.
> 
> 	Predstavoval bych si, ze nejak co nejjednoduseji zapisu
> jak se jmenuje korenovy element, jake muze/musi mit atributy a tagy uvnitr
> (vyhodou by bylo popsat i jak maji hodnoty atributu a text uvnitr tagu
> vypadat, nejlepe jednoduchym perlovym regularnim vyrazem, ale neni to nutne)
> a totez pak o kazdem dalsim pouzitem tagu. Co je dnes moderni? DSSSL?
> XML Schema? Neco jineho?

Kdyz pouzijes XML Schema, tak neurazis. ;-)

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;
use XML::Validator::Schema;
use Data::Dumper;

my $simple = new XML::Simple;
my $validator = XML::Validator::Schema->new(Handler => $simple,
        file => 'foo.xsd');
my $parser = XML::SAX::ParserFactory->parser(Handler => $validator);

my $ref = eval { $parser->parse_uri('foo.xml') };
die "File failed validation: $@" if $@;
print Dumper $ref;

__END__

File failed validation: Found unexpected <qualificationx> inside <character>.  This is not a valid child element. at /usr/lib64/perl5/vendor_perl/5.8.8/x86_64-linux-thread-multi/XML/LibXML/SAX.pm line 64
 at ./simple-validator.pl line 15

> 	Zvolenou validacni technologii bych ale potreboval pouzit
> v Perlu tak, abych jednoduse rekl "tady jsou data a tady je popis struktury"
> a dostal stav validni/nevalidni s tim, ze u nevalidniho bych dostal prvni
> chybu - popis a cislo radku (pripadne i vsechny chyby, ale neni to nutne).
> Pokud si dobre vzpominam, pred par lety jsem mel snahu toto delat
> nad XML Schema, a tato validace (pokud jsem chtel i cislo radku chyby)
> vyzadovala fakt hodne programovani a prislusne perlove moduly byly
> fakt hodne tezkopadne.

Nojo, kdyz ses fajnsmekr a chces i cisla radku, tak budes muset pouzit

#!/usr/bin/perl

use strict;
use warnings;

use XML::Simple;
use XML::Validator::Schema;
use XML::Filter::ExceptionLocator;
use XML::SAX::ExpatXS;
use Data::Dumper;

my $simple = new XML::Simple;
my $validator = new XML::Validator::Schema(Handler => $simple,
        file => 'foo.xsd');
my $parser = new XML::SAX::ExpatXS(Handler => $validator);

my $ref = eval { $parser->parse_uri('foo.xml') };
die "File failed validation: $@" if $@;
print Dumper $ref;

__END__

File failed validation: Found unexpected <qualificationx> inside <character>.  This is not a valid child element. [Ln: 10, Col: 18]

-- 
------------------------------------------------------------------------
 Honza Pazdziora | adelton na fi.muni.cz | http://www.fi.muni.cz/~adelton/
             .project: Perl, C, Red Hat Network, IPv6, VoIP
		Only self-confident people can be simple.


Další informace o konferenci Perl