Una solución para lo que quieres es: definir la plantilla con XSD, y luego, con el módulo
XML::Validator::Schema, validar si el XML es conforme a ese XSD.
Por ejemplo, tenemos esta plantilla:
Using xml Syntax Highlighting
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sql="urn:schemas-microsoft-com:mapping-schema">
<xsd:element name="elementname">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="field1" type="xsd:integer" minOccurs="0" maxOccurs="1"/>
<xsd:element name="field2" type="xsd:string" minOccurs="0" maxOccurs="1"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Entonces se puede crear un programa que valide el xml:
Using perl Syntax Highlighting
use XML::SAX::ParserFactory;
use XML::Validator::Schema;
$validator = XML::Validator::Schema->new(file => 'foo.xsd');
$parser = XML::SAX::ParserFactory->parser(Handler => $validator);
eval { $parser->parse_uri('foo.xml') };
die "File failed validation: $@" if $@
Coloreado en 0.003 segundos, usando
GeSHi 1.0.8.4
También se puede hacer con la biblioteca LibXML:
Using perl Syntax Highlighting
#!/usr/bin/perl
use strict;
use warnings;
use XML::LibXML;
my $xml = 'Export.xml';
my $xsd = 'export.xsd';
if ( my $error = validate_xml_against_xsd($xml, $xsd) ) {
die "Validation failed: $error\n";
}
sub validate_xml_against_xsd {
my ($xml, $xsd) = @_;
my $schema = XML::LibXML::Schema->new(location => $xsd);
my $parser = XML::LibXML->new;
my $doc = $parser->parse_file($xml);
eval { $schema->validate( $doc ) };
if ( my $ex = $@ ) {
return $ex;
}
return;
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Y una vez validado, sacar la información con
XML::DOM.
Sacado de
aquí y
aquí.