Java XPathFactory不工作

Java XPathFactory不工作,java,xml,xpath,saxon,Java,Xml,Xpath,Saxon,我试图使用XPathFactory来计算Java应用程序中的表达式。但我得到了一个撒克逊特有的错误。有一次,我使用Saxon实现一些功能,为此我必须设置一个系统属性: System.setProperty("javax.xml.xpath.XPathFactory:" + NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl"); XPathFacto

我试图使用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);
System.setProperty("javax.xml.xpath.XPathFactory:",
                "org.apache.xpath.jaxp.XPathFactoryImpl");

            XPathFactory factory = XPathFactory.newInstance();
但是,现在我只想使用默认的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)
...

但这没有帮助,我仍然收到相同的错误消息


为了再次使用默认的XPathFactory,我该如何摆脱它?(在我尝试使用Saxon之前,这很有效)

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


如果可能的话,更喜欢真正的Xerces实现而不是JDK中的实现。它更可靠。

我也遇到过同样的问题。即使没有调用“System.setProperty”,jaxp也会加载saxon的xpath引擎,因为默认实现证明saxon jar位于类路径上。参考文献:

我的解决方案是:直接调用saxon为:“XPathFactory _xFactory=new net.sf.saxon.xpath.xpathfactorympl();”并在类路径上的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使用了

,您是否已经从类路径中删除了Saxon?嗯,我不能。以后还有其他事情需要它。我需要能够选择使用默认的XPathFactory,即使Saxon仍然作为jar库存在于应用程序中。
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();
        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());