0

我正在使用 XOM 库来解析 xml。我有以下 XML

<ns4:parent xmlns:ns4="http://sample.xml.com/ns4">
    <ns4:child1 xmlns:ns1="http://sample.xml.com/ns1" xmlns:xsi="http://sample.xml.com/xsi">
        <ns1:child2>divaStatus</ns1:child2>
        <xsi:child>something</xsi:child>
    </ns4:child1>
</ns4:parent>

我想应用一个像ns4:parent/ns4:child1/ns1:child2. 所以我的代码如下

Document doc = new Builder().build(inStream);  //inStream is containing the xml
XPathContext xc = XPathContext.makeNamespaceContext(doc.getRootElement());
doc.query("ns4:parent/ns4:child1/ns1:child2", xc);

我要XPathException到这里了。

 Exception in thread "main" nu.xom.XPathException: XPath error: XPath expression uses unbound namespace prefix ns1.

我可以理解,由于我仅通过根元素创建命名空间上下文,因此它没有获取其子元素的命名空间。因此,一种解决方法可能是遍历所有孩子并收集他们的命名空间并将其添加到XpathContext对象中。但我的 xml 可以是 10 到 20k 行。所以我担心遍历方法的效率会有多高。

期待任何更好的建议

4

2 回答 2

2

这很容易(或者尽可能简单,考虑到 XPath 和 XML 命名空间的设计)。您只需要手动将要使用的任何命名空间添加到上下文中。例如,在这种情况下,

XPathContext xc = new XPathContext();
xc.addNamespace("ns4", "http://sample.xml.com/ns4");
xc.addNamespace("ns1", "http://sample.xml.com/ns1");
doc.query("ns4:parent/ns4:child1/ns1:child2", xc);

请注意,您不必在文档使用的 XPath 表达式中使用相同的前缀。

于 2013-04-24T09:28:52.550 回答
0

大概您知道与每个元素名称相关联的名称空间。所以你可以写:

String xpath = "*[local-name()='parent' and namespace-uri()='http://sample.xml.com/ns4']"+
  "*[local-name()='child1' and namespace-uri()='http://sample.xml.com/ns2']"+
  "*[local-name()='child2' and namespace-uri()='http://sample.xml.com/ns1']";

我希望它与前缀版本一样有效。

于 2013-04-02T23:03:50.590 回答