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


in reply to XML::LibXML and XML Namespaces (processing OpenOffice documents)

And now a small lesson on XML namespaces

no, seriously

In namespace-aware XML documents, an element name is a qualified name (qname), composed by a prefix and a local name, separated by a colon (:). The prefix is bound to a URI via a namespace declaration. Example:

<first> <ns:second> <my:third xmlns:my="someURI"> <fourth xmlns="otherURI"> <fifth/> </fourth> </my:third> </ns:second> </first>

Let's read that. The element named first has a local name of first, and belongs to no namespaces. The element named ns:second is wrong, since namespace-aware parsers require the prefix to be declared, and ns is not. my:third belongs to the someURI namespace, which is locally bound to the my prefix. fourth belongs to the (locally default) namespace otherURI, as does fifth.

Hope this is clear enough...

Your problem

XPath has some problems with namespaces, namely that an XPath expression is interpreted in the context element (which in the case of your program is the invocant of findnodes). So the prefixes are resolved using the namespace declarations visible from that node. This forces you to know the prefixes used in the document, instead of the URIs, which creates the problems I said earlier (prefixes are not unique, URIs are).

Anyway, your problem is much easier: $tree is a XML::LibXML::Document, which has no knwoledge of namespaces, since they are declared (at the earliest) on the document element. This is why the second form works. BTW, in the previous examples (disregarding the ns:second element), if you did:

$docElem->findnodes('//my:third');
It wouldn't work, since the my prefix is not defined on the document element...

-- 
        dakkar - Mobilis in mobile