列出persistence.xml中的所有持久性单元

时间:2010-09-30 02:17:23

标签: xml xpath namespaces xml-namespaces

我正在尝试使用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">

有什么想法吗?

沃尔特

1 个答案:

答案 0 :(得分:2)

这是常见问题解答。每当XML文档声明了默认名称空间时,XPath表达式中的任何非前缀节点测试都被视为“无名称空间”。 XPath表达式不会选择所需的节点,因为它们的名称不在“无名称空间”中,而是在声明的默认名称空间中:

解决方案(或者):

  1. 注册默认命名空间并将其与前缀(例如"xxx")相关联。阅读您正在使用的特定XPath引擎(主机)的文档,以了解如何完成此操作。然后使用此XPath表达式://xxx:persistence/persistence-unit

  2. 使用://*[name()='persistence']/*[name()='persistence-unit']

  3. 最后但并非最不重要的是,尽量避免使用//缩写,因为它通常会导致异常并且效率非常低。

    例如,如果您知道所有persistence-unit元素都是top元素的子元素,那么请使用:

    /*/xxx:persistence-unit