3

我发现这种查询 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文档仅涉及命名空间......有没有办法完成我正在寻找的东西?

4

2 回答 2

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];
于 2014-10-07T03:21:52.323 回答
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];
于 2013-12-01T18:19:08.650 回答