http://qs321.pair.com?node_id=601507

valavanp has asked for the wisdom of the Perl Monks concerning the following question:

Monks, I have an xml file like this.
<node> <data> <field type="custom_content"> <name>Header: Step 1</name> <content><![CDATA[ <p>TESTING</p> ]]></content> </field> <field> <label>A</label> <input_type>text</input_type> <size>40</size> </field> <field type="custom_content"> <name>sample</name> <content><![CDATA[ <p>test</p> ]]></content> </field> </node>
I have an validation xml file like this:
<node> <?xml version="1.0" encoding="UTF-8"?> <grammar xmlns="http://relaxng.org/ns/structure/1.0" xmlns:a="http://r +elaxng.org/annotation" datatypeLibrary="http://www.w3.org/2001/XMLSch +ema-datatypes"> <start> <element name="data"> <oneOrMore> <choice> <ref name="field"/> <ref name="custom_content_field"/> </choice> </oneOrMore> </element> </start> </grammar> </node>
i have thousands of lines in my xml file. How can i check my xml file is tagged properly with the validation file. how to approach this problem.

20070222 Janitored by Corion: Added formatting, code tags, as per Writeup Formatting Tips

Replies are listed 'Best First'.
Re: xml file validation
by Anonymous Monk on Feb 22, 2007 at 08:37 UTC
Re: xml file validation
by jesuashok (Curate) on Feb 22, 2007 at 09:09 UTC
Re: xml file validation
by maspalio (Scribe) on Feb 22, 2007 at 12:54 UTC
    Hi,

    I'm using XML::Xerces module. FYI, here is a sub that does the trick for my current project:

    use constant SPIRIT_VERSION => '1.2'; use constant SPIRIT_URL => 'http://www.spiritconsortium.org/XMLSch +ema/SPIRIT/' . SPIRIT_VERSION; =head2 validate_file validate_file ( $file, $ressucitate ) Validates SPIRIT DOM against its XML-Schema. Uses document URI unless +$ENV{SOCK_SCHEMA_LOCATION} is defined. Backbone is Apache Xerces library, only used in SOCK for validation pu +rposes. Expires unless $ressucitate is set. Returns validation errors. =cut sub validate_file { my ( $file, $ressucitate ) = @_; assert_nonblank $_[0]; if ( $ENV{SOCK_SCHEMA_LOCATION} ) { expire "Could not find any '$ENV{SOCK_SCHEMA_LOCATION}' directory! +" unless -d $ENV{SOCK_SCHEMA_LOCATION}; } say "Validating '$file' file..."; XML::Xerces::XMLPlatformUtils::Initialize (); my $parser = XML::Xerces::SAXParser->new; my $options = { setDoNamespaces => 1, setDoSchema => 1, setErrorHandler => XML::Xerces::PerlErrorHandler-> +new, setExitOnFirstFatalError => 0, setExternalSchemaLocation => SPIRIT_URL . ' ' . ( $ENV{SOCK_ +SCHEMA_LOCATION} || SPIRIT_URL ) . '/index.xsd', setValidationConstraintFatal => 0, setValidationSchemaFullChecking => 1, setValidationScheme => $XML::Xerces::AbstractDOMParser +::Val_Always, }; $parser->$_ ( $options->{$_} ) for keys %$options; eval { $parser->parse ( $file ) }; my $error = $@; $error = $error->getMessage if ref $error; XML::Xerces::XMLPlatformUtils::Terminate (); if ( $error ) { $error =~ s/ERROR:/Validation error:/; $error =~ s/\s+ at .+ line \d+\n//; $error =~ s/\n/\n--- /g; expire $error unless $ressucitate; counsel $error; } say "Done."; $error; }

    HTH.

    Cheers,

    X.