Saxon 9.7和XMLBeans / XPath

时间:2017-01-31 13:32:51

标签: xpath saxon xmlbeans

我尝试在我的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"/>

2 个答案:

答案 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中),尽管该文档尚未更新以反映这一点。