Pergunta

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?

Foi útil?

Solução

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];

Outras dicas

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];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top