如何通过* default * namespace来XmlObject.selectPath()?

时间:2013-11-05 15:40:23

标签: java xml xpath namespaces xmlbeans

我找到了查询XmlObject的方法,以返回包含特定命名空间的元素:

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

这非常简单,可用于其他命名的命名空间,但如何对默认命名空间执行相同操作?即xmlns=喜欢这样:

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

xmlbeans documentation仅指名为的名称空间......有没有办法完成我要找的内容?

2 个答案:

答案 0 :(得分:1)

xml中的命名空间前缀本质上是命名空间uri的别名。换句话说,名称空间前缀无关紧要 - 只是名称空间URI。您可以在xpath中声明名称空间前缀,即使它没有出现在xml文档中。例如,您可以使用xpath中的'B'前缀来引用默认命名空间:

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

答案 1 :(得分:1)

我在Applying XPath to an XML with or without namespace找到了XMLBeans默认命名空间的答案。

将它应用于您的示例:

String nsDeclaration = "declare default element namespace 'testB';";
XmlObject bobj = xobj.selectPath(nsDeclaration + ".//b")[0];