我尝试在我的Web应用程序中使用Saxath 9.7.0-14 EE和xmlbeans-2.6.0 / xmlbeans-xpath-2.6.0
Movement mov = (Movement) XPathUtils.executeQueryNoResultNull(message.getPayload(), "//trx:Movement [@tipo='RESTO']");
与
public static XmlObject executeQueryNoResultNull(XmlObject source, String query) {
XmlObject[] results = source.selectPath(DECLARE_NS + "$this" + query);
if (results.length == 0) {
return null;
} else {
return results[0];
}
}
我有这个错误
java.lang.RuntimeException: Trying XBeans path engine... Trying XQRL... Trying XDK... Trying delegated path engine... FAILED on declare namespace trx='http://www.test.com/xxx/xx/trx';$this//trx:Movement[@tipo='RESTO']
at org.apache.xmlbeans.impl.store.Path.getCompiledPath(Path.java:185)
at org.apache.xmlbeans.impl.store.Path.getCompiledPath(Path.java:136)
at org.apache.xmlbeans.impl.store.Cursor._selectPath(Cursor.java:902)
at org.apache.xmlbeans.impl.store.Cursor.selectPath(Cursor.java:2634)
at org.apache.xmlbeans.impl.values.XmlObjectBase.selectPath(XmlObjectBase.java:476)
at org.apache.xmlbeans.impl.values.XmlObjectBase.selectPath(XmlObjectBase.java:460)
问题是XMLBeans吗?我可以只使用Saxon并删除XMLBeans吗?
这是我的module.xml
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="app-common">
<resources>
<resource-root path="jsr173_1.0_api.jar"/>
<resource-root path="resolver.jar"/>
<resource-root path="xbean_xpath.jar"/>
<resource-root path="saxon9ee.jar"/>
<resource-root path="saxon9-dom.jar"/>
<resource-root path="xmlbeans-2.6.0.jar"/>
答案 0 :(得分:0)
我不是XMLBeans的专家,但我想知道问题是否是“XPath”表达式问题
declare namespace trx='http://www.test.com/xxx/xx/trx';$this//trx:Movement[@tipo='RESTO']
不是真正的XPath(因为'declare namespace')因此不适用于第三方XPath引擎?
答案 1 :(得分:0)
对于XMLBeans版本3.1.0,我成功使用的SaxonHE的最新版本是9.2.1-5。 9.3版及更高版本中的任何内容都会触发您所看到的错误,即,未能找到可以处理带有谓词的查询的XPath引擎的尝试失败。 XMLBeans文档explain为什么不使用谓词就可以进行查询:
默认情况下,XMLBeans仅支持非常简单的XPath表达式。至 执行复杂的表达式,例如带有谓词,函数的表达式 调用等–您将需要xbean_xpath.jar和Saxon jars (请参见下文)。
使用XMLBeans 3.x,您不需要包括xbean_xpath.jar(这些类包含在xmlbeans-3.1.0.jar中),尽管该文档尚未更新以反映这一点。