我正在尝试使用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">
有什么想法吗?
沃尔特
答案 0 :(得分:2)
这是常见问题解答。每当XML文档声明了默认名称空间时,XPath表达式中的任何非前缀节点测试都被视为“无名称空间”。 XPath表达式不会选择所需的节点,因为它们的名称不在“无名称空间”中,而是在声明的默认名称空间中:
解决方案(或者):
注册默认命名空间并将其与前缀(例如"xxx"
)相关联。阅读您正在使用的特定XPath引擎(主机)的文档,以了解如何完成此操作。然后使用此XPath表达式://xxx:persistence/persistence-unit
使用://*[name()='persistence']/*[name()='persistence-unit']
最后但并非最不重要的是,尽量避免使用//
缩写,因为它通常会导致异常并且效率非常低。
例如,如果您知道所有persistence-unit
元素都是top元素的子元素,那么请使用:
/*/xxx:persistence-unit