[xml] XPath and default namespaces (bet you're sick of this by now :) )



Dear Daniel (and other list readers),
        I have been playing with the libxml implementation, attempting
to write something I can use to bind xml documents into structures
somehow.
        Firstly: C'est fantastique!

But secondly, I have fallen afoul of the default namespace problem.
I saw many postings, where Daniel and others told everyone that it is all OK and not buggy especially after v 2.4, but I didn't quite
grasp the workaround.

I looked at the libxml code (v 2.5.1)
and find that in the file xpath.c:

---- snip snip ----
int
xmlXPathRegisterNs(xmlXPathContextPtr ctxt, const xmlChar *prefix,
                           const xmlChar *ns_uri) {
    if (ctxt == NULL)
        return(-1);
    if (prefix == NULL)
        return(-1);

---- snip snip ----

This is confusing because, in the tree, the default namespace
as far as I seem to remember has a NULL prefix. As quoted on
http://xmlsoft.org/html/libxml-tree.html:

An XML namespace. Note that prefix == NULL is valid, it defines the default namespace within the subtree (until overridden).

Hence my natural inclination for defining the default namespace for XPath would be to pass a NULL prefix to xmlXPathRegisterNs, which of course the above code snippet immediately rejects as erroneous.

As others have covered: registering "" doesn't seem to work.

What I can do, is register some dummy namespace:

eg:
    xmlNodePtr current_node=(get this node some magic way);
    xmlNsPtr nsdefptr = current_node->nsDef;
    if(nsdefptr != NULL) {
         if(nsdefptr->prefix == NULL) {
            xmlXPathRegisterNs(xpath_context,
                               (const xmlChar *)"dummy",
                               nsdefptr->href);
         }
    }

    but in this case I have to prefix all my XPath query
element id's (which are meant to be in the default namespace)
with dummy: (eg  <foo/> needs XPath: /dummy:foo) This is not nice.

I know you all are sick of this query, but would you please
help me out?

        Many thanks,
                Balint








--
-------------------------------------------------------------------
Dr Balint Joo                         Post Doctoral Research Fellow
School of Physics
University of Edinburgh
Mayfield Road, Edinburgh EH9 3JZ
Scotland UK
Tel: 0131 650 6469 (from UK) +44-131-650-6469 (from outwith UK)
Fax: 0131 650 5902 (from UK) +44-131-650-5902 (from outwith UK)
email: bj ph ed ac uk           bj phys columbia edu
WWW  : http://www.ph.ed.ac.uk/~bj
-------------------------------------------------------------------




[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]