<xxx1 xmlns="hello">
<xxx2>
<xxx3>
<name>rule_1</name>
</xxx3>
</xxx2>
</xxx1>
我通过“ // * [namespace-uri()='hello'] / * [local-name()='name']”选择节点
它应该得到//hello:xxx1/xxx2/xxx3/name
,并且确实如此。
现在,我尝试获取element。实际上,我不知道<name>
的父母多少会得到<xxx1>
;
我尝试此代码
node.getParent().getNamespaceURI() = "Hello"
增加getParent()
的数量即可获得<xxx1>
但是我第一次打电话给<xxx3>.getNamespaceURI()
时会返回true
。
命名空间是否继承?
如何获取元素是否具有xmlns?
抱歉,我的问题不清楚。
我正在尝试获取元素,它是第一个声明的名称空间“ hello”。
<xxx1 xmlns="hello">
<xxx2>
<xxx3>
其中三个包含xmlns="hello"
的三个节点,原因是<xxx2>
和<xxx3>
在标签中未声明xmlns
。
答案 0 :(得分:0)
您好,欢迎来到堆栈溢出!
是的,名称空间是一种继承的名称,但是通常使用的术语是,在您的示例中,<name>
元素位于名称空间声明xmlns="hello"
的 scope 中,因此<name>
元素将在hello
名称空间的中。
使用DOM4J
,您可以测试元素是否在名称空间中:
boolean hasNamespace(Element e) {
return e.getNamespaceURI().length() > 0;
}
如果该元素不在任何命名空间中,则getNamespaceURI()
返回一个空字符串。
我猜您想选择<name>
元素,但是您不知道它在哪个级别,即它将有多少个父母。您始终可以使用以下XPath表达式:
Node node = doc.selectSingleNode("//*[namespace-uri() = 'foo' and local-name() = 'name']");