У меня проблема с анализом Xml от стороннего производителя; есть несколько разных версий отправляемого им xml с перекрывающимися пространствами имен;
Версия 1
Foo = "урна: bar.org/version-1"
далеко = "урна: gle.org/version-1"
Версия 2
Foo = "бар: a.org/version-2"
далеко = "гле: a.org/version-2"
Ранее (когда мне приходилось обрабатывать только одну версию) я регистрировал пространства имен из жестко закодированного хэша, например:
#!/usr/bin/perl
use strict;
use XML::LibXML ;
my $cfg->{namespace} = {
foo=>"urn:bar.org/version-1",
far=>"urn:gle.org/version-1",
};
my $parser = XML::LibXML->new({recover => '1'});
my $doc = $parser->parse_string($inputHash->{$key}->{xml});
my $xc = XML::LibXML::XPathContext->new( $doc->documentElement() );
for my $ns (keys %{$cfg->{namespace}})
{
$xc->registerNs($ns => $cfg->{namespace}->{$ns});
}
очевидно, это будет работать только на версии 1 ..
Изучил документацию LibXML, но не может найти способ извлечь пространства имен, используемые в документе, и зарегистрировать их; кто-нибудь может дать мне указатель, пожалуйста?
Псевдо-док:
<?xml version="1.0"?>
<foo:Parent xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:foo="bar:a.org/version-2">
<far:Child xmlns:gle="gle:a.org/version-2">
{horrific structure with more ns declarations all of which need registering}
</far:Child>
</foo:Parent>