Перечислите все единицы измерения персистентности в файле persistence.xml - PullRequest
1 голос
/ 30 сентября 2010

Я пытаюсь использовать XPath для получения списка всех модулей персистентности в файле persistence.xml, и у меня возникли проблемы. То, что я думал, будет работать:

//persistence/persistence-unit

*

Последний дает мне постоянный дочерний элемент, который является, по крайней мере, чем-то, что я могу затем выполнить вручную, но это противоречит цели XPath.

Вот фрагмент моего файла persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
             version="1.0">
    <persistence-unit name="default" transaction-type="RESOURCE_LOCAL">

Есть идеи?

Walter

1 Ответ

2 голосов
/ 30 сентября 2010

Это часто задаваемые вопросы. Всякий раз, когда XML-документ имеет объявленное пространство имен по умолчанию, любые не имеющие префикса нод-тесты в выражении XPath считаются находящимися в «без пространства имен». Выражение XPath не выбирает обязательные узлы, поскольку их имена не находятся в «пространстве имен», а в объявленном пространстве имен по умолчанию:

Решение (либо):

  1. Зарегистрировать пространство имен по умолчанию и связать его с префиксом (скажем, "xxx"). Прочитайте документацию конкретного движка XPath (хоста), который вы используете, чтобы понять, как именно это сделать. Затем используйте это выражение XPath: //xxx:persistence/persistence-unit

  2. Использование: //*[name()='persistence']/*[name()='persistence-unit']

И последнее, но не менее важное: старайтесь избегать использования аббревиатуры //, поскольку это часто приводит к аномалиям и также может быть очень неэффективным.

Например, если вы знаете, что все элементы persistence-unit являются дочерними элементами верхнего элемента, используйте:

/*/xxx:persistence-unit
...