Как узнать, что элемент содержит пространство имен (xmlns) или нет?

<xxx1 xmlns="hello">
    <xxx2>
        <xxx3>
            <name>rule_1</name>
        </xxx3>
    </xxx2>
</xxx1>

Я выбираю узел следующим образом: "// * [namespace-uri () = 'hello'] / * [local-name () = 'name']"

Должно получиться //hello:xxx1/xxx2/xxx3/name, и так оно и есть.

Теперь пытаюсь получить элемент. На самом деле я не знаю, сколько родитель для <name> получит <xxx1>;

Я пробую этот код

node.getParent().getNamespaceURI() = "Hello"

и увеличьте сумму getParent(), чтобы получить <xxx1>

Но в первый раз, когда я вызываю <xxx3>.getNamespaceURI(), он возвращает true.

Унаследовано ли пространство имен?

Как получить элемент имеет или не имеет xmlns?


Извините за мой вопрос был непонятно.

Я пытаюсь получить элемент, который является первым объявленным пространством имен «привет».

<xxx1 xmlns="hello">
    <xxx2>
        <xxx3>

эти три узла, которые содержат xmlns="hello", потому что <xxx2> и <xxx3> не были объявлены xmlns на этикетке.


person alluLinger    schedule 30.12.2019    source источник
comment
ваш вопрос непонятен ... не могли бы вы объяснить на лучшем примере, чтобы увидеть, чего вы хотите достичь?   -  person Hades    schedule 30.12.2019


Ответы (1)


Привет и добро пожаловать в Stack Overflow!

Да, пространства имен являются своего рода унаследованными, но обычно используется терминология, согласно которой в вашем примере элемент <name> находится в области объявления пространства имен xmlns="hello", поэтому <name>element будет в < / em> пространство имен 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']");
person forty-two    schedule 30.12.2019
comment
Извините за мой плохой экспресс, я пытаюсь получить элемент <xxx1>, я хочу получить родительский элемент <name>, который содержит (напишите на этикетке) xmlns="hello". - person alluLinger; 31.12.2019
comment
Вы хотите получить самый дальний элемент-предок элемента <name>, который объявляет пространство имен hello? - person forty-two; 04.01.2020