XML的应用XPath的地方命名空间与XOM儿童(Applying xpath on XML whe

2019-11-01 14:11发布

我使用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>

我想申请类似的XPath 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线。 所以,我怕的是,遍历方法将如何有效的是。

期待任何更好的建议

Answer 1:

这是容易的(或容易,因为它可以是,给定的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表达式。



Answer 2:

想必你知道这是每个元素名关联的命名空间。 所以,你可以写:

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

我期望这是作为前缀的版本那样高效。



文章来源: Applying xpath on XML where namespaces are with children with XOM