Это часто задаваемые вопросы. Всякий раз, когда XML-документ имеет объявленное пространство имен по умолчанию, любые не имеющие префикса нод-тесты в выражении XPath считаются находящимися в «без пространства имен». Выражение XPath не выбирает обязательные узлы, поскольку их имена не находятся в «пространстве имен», а в объявленном пространстве имен по умолчанию:
Решение (либо):
Зарегистрировать пространство имен по умолчанию и связать его с префиксом (скажем, "xxx"
). Прочитайте документацию конкретного движка XPath (хоста), который вы используете, чтобы понять, как именно это сделать. Затем используйте это выражение XPath: //xxx:persistence/persistence-unit
Использование: //*[name()='persistence']/*[name()='persistence-unit']
И последнее, но не менее важное: старайтесь избегать использования аббревиатуры //
, поскольку это часто приводит к аномалиям и также может быть очень неэффективным.
Например, если вы знаете, что все элементы persistence-unit
являются дочерними элементами верхнего элемента, используйте:
/*/xxx:persistence-unit