如何知道元素是否包含命名空间(xmlns)?

时间:2019-12-30 08:39:43

标签: java xml dom4j

<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

1 个答案:

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