我有一个简单的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表达式那样做。 感谢
答案 0 :(得分:0)
简单的答案是,你做不到。命名空间前缀只是命名空间URI的简写,这一切都很重要。
对于名称空间感知解析器,您的两个标记是相同的。
如果你真的想要使用前缀区分(虽然你真的,真的不应该这样做),你可以使用非命名空间感知的解析器,只需将前缀视为元素名称的一部分。
但理想情况下,您应该阅读有关命名空间如何工作的教程,并尝试使用它们,因为它们是为了使用而设计的。