An xml::dom::parser that validates at parse time
use XML::DOM::ValParser; my %expat_options = (KeepCDATA => 1, Handlers => [ Unparsed => \&my_Unparsed_handler ]); my $parser = new XML::DOM::ValParser (%expat_options); eval { local $XML::Checker::FAIL = \&my_fail; my $doc = $parser->parsefile ("fail.xml"); ... XML::DOM::Document was created successfully ... }; if ($@) { # Either XML::Parser (expat) threw an exception or my_fail() died. ... your error handling code here ... # Note that the XML::DOM::Document is automatically disposed off and # will be garbage collected } # Throws an exception (with die) when an error is encountered, this # will stop the parsing process. # Don't die if a warning or info message is encountered, just print a message. sub my_fail { my $code = shift; die XML::Checker::error_string ($code, @_) if $code < 200; XML::Checker::print_error ($code, @_); }
Use XML::DOM::ValParser wherever you would use XML::DOM::Parser and your \s-1XML\s0 will be checked using XML::Checker at parse time.
See \s-1XML::DOM\s0 for details on XML::DOM::Parser options. See XML::Checker for details on setting the fail handler (my_fail.)
The following handlers are currently supported, just like XML::DOM::Parser: Init, Final, Char, Start, End, Default, Doctype, CdataStart, CdataEnd, XMLDecl, Entity, Notation, Proc, Default, Comment, Attlist, Element, Unparsed.
XML::DOM::ValParser extends from XML::Checker::Parser. It creates an XML::Checker object and routes all event handlers through the checker, before processing the events to create the XML::DOM::Document.
Just like XML::Checker::Parser, the checker object can be retrieved with the getChecker() method and can be reused later on (provided that the \s-1DOCTYPE\s0 section of the XML::DOM::Document did not change in the mean time.)
You can control which errors are fatal (and therefore should stop creation of the XML::DOM::Document) by filtering the appropriate error codes in the global $XML::Checker::FAIL handler (see \*(L"\s-1ERROR_HANDLING\s0\*(R" in XML::Checker) and calling die or croak appropriately.
Just like XML::Checker::Parser, XML::DOM::ValParser supports the SkipExternalDTD and SkipInsignifWS options. See XML::Checker::Parser for details.
Enno Derksen is the original author.
Send bug reports, hints, tips, suggestions to T.J. Mather at <[email protected]>.
\s-1XML::DOM\s0, XML::Checker (\*(L"\s-1SEE_ALSO\s0\*(R" in XML::Checker)