2014-04-08 47 views
6

我正在嘗試使用XPathFactory來評估Java應用程序中的表達式。但是我得到了一個撒克遜特定的錯誤。有一段時間我使用撒克遜的一些功能,要做到這一點,我不得不設置一個系統屬性:XPathFactory不工作

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

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

不過,現在我只想使用默認的DOM做一些XML處理(org.w3c.dom中.Document)並用xpath進行處理,所以不需要撒克遜。但是,當我試圖創建的XPathFactory我仍然得到撒克遜錯誤消息:

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之前,這工作得很好)

+0

你是否從類路徑中刪除了撒克遜? –

+0

嗯,我不能。以後會需要其他的東西。我需要能夠選擇使用默認的XPathFactory,儘管Saxon仍然是應用程序中的jar庫。 – Anders

回答

1

作爲一種解決方法,您可以顯式實例化JDK工廠(或Xerces's或Saxon's)。

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(); 

如果可能的話,更喜歡真正的Xerces實現到JDK中的實現。它更可靠。

1

我遇到了同樣的問題。即使沒有調用「System.setProperty」,jaxp也會將saxon的xpath引擎加載爲默認實現,以驗證saxon jar是否在類路徑中。參考:namespace-unaware XPath expression fails if Saxon is on the CLASSPATH

我的解決方案:直接調用撒克遜:「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()); 

輸出: [email protected] com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl @ 768b970c 由於Jaxp使用apache的jaxen作爲默認的xpath實現,所以這個方法應該是工作工具。 由於JAXP使用