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

问题描述 投票:1回答:1
<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?

java xml dom4j
1个回答
0
投票
是,名称空间是一种继承的,但是通常使用的术语是,在您的示例中,<name>元素位于名称空间声明xmlns="hello"

scope中,因此<name>元素将为[[in 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']");
© www.soinside.com 2019 - 2024. All rights reserved.