在XMLObject中使用XPath按名称空间进行查询

时间:2011-01-14 14:10:13

标签: java xml xpath

我有一个简单的XML文档

<abc:MyForm xmlns:abc='http://myform.com'>
    <abc:Forms>
        <def:Form1 xmlns:def='http://decform.com'>
            ....
        </def:Form1>
        <ghi:Form2 xmlns:ghi='http://ghiform.com'>
            ....
        </ghi:Form2>
    </abc:Forms>
</abc:MyForm>

我正在使用Apache的XMLObjects,当我尝试执行以下xpath表达式时,它可以完美地运行

object.selectPath("declare namespace abc='http://myform.com' 
                   abc:Form/abc:Forms/*");

这给了我2个Form节点(def和ghi)。但是我希望能够通过指定命名空间来查询,所以假设我只想要Form2。我试过这个但它失败了

object.selectPath("declare namespace abc='http://myform.com' 
                   abc:Form/abc:Forms/*
                      [namespace-uri() = 'http://ghiform.com']");

selectPath返回0个节点。有谁知道发生了什么?

更新

如果我分两步完成以下操作,那么我可以得到我想要的结果。

 XmlObject forms = object.selectPath("declare namespace abc='http://myform.com' 
                   abc:Form/abc:Forms")[0];
 forms.selectPath("*[namespace-uri() = 'http://ghiform.com']");

这给了我ghi:Form节点就像它应该的那样,我不明白为什么它不会像单个XPath表达式那样做。 感谢

1 个答案:

答案 0 :(得分:0)

简单的答案是,你做不到。命名空间前缀只是命名空间URI的简写,这一切都很重要。

对于名称空间感知解析器,您的两个标记是相同的。

如果你真的想要使用前缀区分(虽然你真的,真的不应该这样做),你可以使用非命名空间感知的解析器,只需将前缀视为元素名称的一部分。

但理想情况下,您应该阅读有关命名空间如何工作的教程,并尝试使用它们,因为它们是为了使用而设计的。