in reply to Validate XML with schemas specified inline (xsi:schemaLocation) (with libxml or anything different from Xerces)

Generally speaking, you want to validate against a specific schema. For example, if you expect an Open Travel Alliance (OTA) request, you're going to validate against the schema for an OTA request. Or maybe you want to check that your own code generates a proper OTA request or response. Either way, you don't need xsi:schemaLocation. What this means is that ::Schema's interface is more than adequate for most people.

To validate against the schema mentioned within the XML doc, you will to extract the schema URL yourself from the XML doc yourself. This is a rather trivial thing to do. Something like:

my $xpc = XML::LibXML::XPathContext->new; $xpc->registerNs( xsi => 'http://www.w3.org/2001/XMLSchema-instance' ) +; my $doc = XML::LibXML->new->parse_XXX(...); my $schema_loc = $xpc->findvalue('/*/@xsi:schemaLocation', $doc) or die("...\n"); my ($schema_ns, $schema_url) = split(' ', $schema_loc); defined($schema_url) or die("...\n");

Which you'd simply follow up with

my $schema = XML::LibXML::Schema->new( location => $schema_url ); eval { $schema->validate($doc); 1 } or die("...\n");

Seeking work! You can reach me at ikegami@adaelis.com

  • Comment on Re: Validate XML with schemas specified inline (xsi:schemaLocation) (with libxml or anything different from Xerces)
  • Select or Download Code

Replies are listed 'Best First'.
Re^2: Validate XML with schemas specified inline (xsi:schemaLocation) (with libxml or anything different from Xerces)
by jjmoka (Beadle) on Apr 22, 2021 at 06:39 UTC
    Thank you very much. I was thinking to go for the this way, just wishing a confirmation from the experts. More than happy of your solution. Thanks again
Re^2: Validate XML with schemas specified inline (xsi:schemaLocation) (with libxml or anything different from Xerces)
by ikegami (Patriarch) on Apr 21, 2021 at 22:50 UTC

    Fixed errors in find line.

    Seeking work! You can reach me at ikegami@adaelis.com