Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to XmlObject.selectPath() by *default* namespace?

I found this method of querying an XmlObject to return an element containing a particular namespace:

   XmlObject xobj = XmlObject.Factory.parse(
            "<a xmlns='testA'>\n" +
            "  <B:b xmlns:B='testB'>\n" +
            "    <B:x>12345</B:x>\n" +
            "  </B:b>\n" +
            "</a>");

    // Use xpath with namespace delcaration to find <B:b> element.
    XmlObject bobj = xobj.selectPath(
            "declare namespace B='testB'" +
            ".//B:b")[0];

This is pretty straightforward and can be used for other named namespaces, but how do I do the same for a default namespace? i.e. xmlns= like this:

   XmlObject xobj = XmlObject.Factory.parse(
            "<a xmlns='testA'>\n" +
            "  <b xmlns='testB'>\n" +
            "    <x>12345</B:x>\n" +
            "  </b>\n" +
            "</a>");

The xmlbeans documentation only refers to named namespaces... Is there a way to accomplish what I am looking for?

like image 393
Withheld Avatar asked Nov 20 '25 14:11

Withheld


2 Answers

I found the XMLBeans default namespace answer at Applying XPath to an XML with or without namespace.

Applying it to your example:

String nsDeclaration = "declare default element namespace 'testB';";
XmlObject bobj = xobj.selectPath(nsDeclaration + ".//b")[0];
like image 93
Adi Sutanto Avatar answered Nov 22 '25 04:11

Adi Sutanto


Namespace prefixes in xml are essentially an alias for the namespace uri. In other words, the namespace prefix doesn't matter -- just the namespace URI. You can declare the namespace prefix in your xpath even though it doesn't appear in the xml document. For example, you can refer to the default namespace using the 'B' prefix in the xpath:

    // document using default namespace
    XmlObject xobj = XmlObject.Factory.parse(
            "<a xmlns='testA'>\n" +
            "  <b xmlns=''>\n" +
            "    <x>12345</x>\n" +
            "  </b>\n" +
            "</a>");

    // Use xpath with default namespace declaration to find <b> element.
    XmlObject bobj = xobj.selectPath(
            "declare namespace B=''; " +
            ".//B:b")[0];
like image 29
Kevin Krouse Avatar answered Nov 22 '25 04:11

Kevin Krouse