【问题标题】:XPathFactory not workingXPathFactory 不工作
【发布时间】:2014-05-21 01:58:03
【问题描述】:

我正在尝试使用 XPathFactory 来评估 Java 应用程序中的表达式。但我遇到了撒克逊人特有的错误。有一次我将 Saxon 用于某些功能,为此我必须设置一个系统属性:

System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON,
                "net.sf.saxon.xpath.XPathFactoryImpl");

        XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);

但是,现在我只想使用默认的 DOM (org.w3c.dom.Document) 进行一些 XML 处理并使用 xpath 进行处理,因此不需要 Saxon。但是当我尝试创建 XPathFactory 时,我仍然收到 Saxon 错误消息:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: net/sf/saxon/lib/EnvironmentVariableResolver
    at net.sf.saxon.xpath.XPathFactoryImpl.<init>(XPathFactoryImpl.java:26)
...

我什至尝试过“重置”系统属性:

System.setProperty("javax.xml.xpath.XPathFactory:",
                "org.apache.xpath.jaxp.XPathFactoryImpl");

            XPathFactory factory = XPathFactory.newInstance();

System.setProperty("javax.xml.xpath.XPathFactory:",
                    "http://java.sun.com/jaxp/xpath/dom");

                XPathFactory factory = XPathFactory.newInstance();

但这无济于事,我仍然收到相同的错误消息。

我如何摆脱它以便再次使用默认的 XPathFactory? (在我尝试使用 Saxon 之前,这已经很好了)

【问题讨论】:

  • 你是否从类路径中删除了 Saxon ?
  • 好吧,我不能。稍后将需要它来处理其他事情。我需要能够选择使用默认的 XPathFactory,即使 Saxon 仍然作为应用程序中的 jar 库存在。

标签: java xml xpath saxon


【解决方案1】:

作为一种解决方法,您可以显式实例化 JDK 工厂(或 Xerces 或 Saxon 的)。

import org.apache.xpath.jaxp.XPathFactoryImpl
// import com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl
// import net.sf.saxon.xpath.XPathFactoryImpl
...
XPathFactory factory = new XPathFactoryImpl();

如果可能的话,比起 JDK 中的那个,更喜欢真正的 Xerces 实现。更可靠。

【讨论】:

    【解决方案2】:

    我也遇到过同样的问题。即使没有调用“System.setProperty”,jaxp 也会加载 saxon 的 xpath 引擎,因为默认实现提供 saxon jar 在类路径上。参考:namespace-unaware XPath expression fails if Saxon is on the CLASSPATH

    我的解决方案:直接调用 saxon 为:“ XPathFactory _xFactory = new net.sf.saxon.xpath.XPathFactoryImpl();”并在类路径上的 saxon9e.jar 之前添加 jaxen-xxx.jar 和 xercesImpl.jar。其他一切都保持其原始状态,无需调用“System.setProperty”。这对我有用。

    我还测试了另一种方法如下:

            System.setProperty("javax.xml.xpath.XPathFactory:" +XPathConstants.DOM_OBJECT_MODEL, "net.sf.saxon.xpath.XPathFactoryImpl");
    
            XPathFactory xFactory = XPathFactory.newInstance(XPathConstants.DOM_OBJECT_MODEL);
    
            System.setProperty(XPathFactory.DEFAULT_PROPERTY_NAME +":" + XPathFactory.DEFAULT_OBJECT_MODEL_URI, " org.apache.xpath.jaxp.XPathFactoryImpl");
    
            XPathFactory xFactory2 = XPathFactory.newInstance();
    
            System.out.println(xFactory.toString());
            System.out.println(xFactory2.toString());
    

    输出: net.sf.saxon.xpath.XPathFactoryImpl@71623278 com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl@768b970c 由于 Jaxp 使用 apache 的 jaxen 作为其默认的 xpath 实现,因此该方法应该是可行的工具。 由于 JAXP 使用

    【讨论】:

      猜你喜欢
      • 2014-03-19
      • 2012-02-25
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2019-06-12
      • 2021-01-10
      • 1970-01-01
      • 2019-01-19
      相关资源
      最近更新 更多