【问题标题】:xalan and saxon at same time on apache camelxalan 和撒克逊同时在 apache 骆驼上
【发布时间】:2014-12-02 09:17:06
【问题描述】:

我找到了这个Using Xalan alongside Saxon,但我没有让它工作。

我在我的pom.xml 中插入camel-saxon 的依赖项

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-saxon</artifactId>
    <version>2.14.0</version>
</dependency>

并得到这个错误:

java.util.ArrayList cannot be cast to org.w3c.dom.NodeList

在此代码中:

public NodeList getXPathFromFile(String xpathStr, String xmlfile) {
        NodeList nodes = null;
        try {
            System.setProperty(XPathFactory.DEFAULT_PROPERTY_NAME + ":"
                    + XPathFactory.DEFAULT_OBJECT_MODEL_URI,
                    "org.apache.xpath.jaxp.XPathFactoryImpl");

                XPathFactory jaxpFactory = XPathFactory.newInstance(XPathFactory.DEFAULT_OBJECT_MODEL_URI);

            XPath xpath = jaxpFactory.newXPath(); /*XPathFactory.newInstance()*/
            String expression = xpathStr;
            InputSource inputSource = new InputSource(xmlfile);
            nodes = (NodeList) xpath.compile(expression).evaluate(inputSource, XPathConstants.NODESET); <-- here come's the error
        } catch (XPathExpressionException | XPathFactoryConfigurationException e) { 
            e.printStackTrace();
        }
        return nodes;
    }

如果我删除依赖项,我的代码运行良好。但是我的骆驼路线需要 xslt 2.0,并且不想更改我的代码。我错了什么?

我需要导入一些东西吗?

【问题讨论】:

    标签: xslt xpath apache-camel saxon xalan


    【解决方案1】:

    在我看来,您似乎选择了 Saxon 作为 XPath 工厂。 (默认情况下,Saxon 为 XPath InputSource 构建自己的本地树,而不是 DOM,因此返回 Java 列表中的节点而不是 DOM NodeList)。

    您确定要在每次执行 XPath 表达式时解析 XML 文件吗?因为这就是你的代码正在做的事情。

    鉴于您的 System.setProperty() 设置,我不确定为什么这段代码会选择 Saxon。 Saxon 在 9.6 版中进行了更改,因此它不再将自己注册为 JAXP XPath 工厂,这消除了这个问题(我们决定人们真的想知道他们获得的是 XPath 1.0 还是 2.0 处理器,而 XPath 工厂机制为您提供了任何一个位于类路径上)。

    可能的解决方案是:

    (a) 直接实例化 Apache XPath 工厂,而不是依赖于 JAXP 类路径搜索(这非常昂贵,特别是如果您这样做只是为了评估单个 XPath 表达式)

    (b) 将 Saxon 升级到 9.6

    (c) 更改此代码,使其适用于 Saxon。如果您不关心性能,最简单的更改是确保源文档作为 DOMSource 传递。尽管 Saxon 在使用 DOM 时要慢得多,但与每次执行 XPath 时创建 XPath 工厂和解析源文档的成本相比,这种低效率相形见绌。如果你想让整个事情更有效率,那就意味着查看你展示给我们的片段之外的代码。

    【讨论】:

    • 感谢您的回答!是的,每次都解析 xml 文件时没关系,因为 xml 文件只加载一次。为您的解决方案。 b = 不可行,因为 apache camel 与 9.6 不兼容。在 c 我正在工作,但我对撒克逊人一无所知,而且除了我需要之外,它还可以工作。或者我不知道我是怎么做到的。我读了她更多。现在到了,这就是我想要的快速解决方案。但是我所有的实验都不起作用。你能说我,我怎么能从 Apache XPath 工厂做一个直接的实例?非常感谢(我是 Java 新手)
    • 只需将 factory.newInstance() 调用替换为 new org.apache.xpath.jaxp.XPathFactoryImpl()
    猜你喜欢
    • 2010-10-02
    • 2016-09-10
    • 2012-05-18
    • 2018-10-19
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多