I\'m using XML::LibXML to parse an XML document with a namespace. I therefore use XML::LibXML::XPathContext to findnodes
using the XPath //u:model
You can't use $node->findvalue()
because of the whole default namespace thing. However, you can reuse your XML::LibXML::XPathContext object to find the values you want:
for my $node ( $context->findnodes('//u:model') ) {
my $mh = $context->findvalue('u:mh', $node);
my $attr = $context->findvalue('u:attribute', $node);
print "mh = $mh, attr = $attr\n";
}
XPath allows ignoring namespaces by using the function local-name:
use XML::LibXML;
my $dom = XML::LibXML->load_xml( IO => \*DATA );
for my $node ( $dom->findnodes('//*[local-name()="model"]') ) {
my $mh = $node->findvalue('*[local-name()="mh"]');
my $attr = $node->findvalue('*[local-name()="attribute"]');
print "mh = $mh, attr = $attr\n";
}
This removes the need to specify an context for a single namespace document like in the question.
Reference: Re^2: XML::LibXML and namespaces