2013-06-26 72 views
3

我使用org.w3c.dom庫將XML ElementsDocuments存儲在我製作的Item類中。有時我需要使用setAttribute來配置Elements以供稍後解析(由用.NET編寫的服務器完成)。我最初使用JDOM,但由於XPath和selectSingleNode被棄用,它不再具有我需要的功能。TransformerException:XPath中的未知錯誤

我的變量聲明爲:

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db; 
Document outDom = null; 
db = dbf.newDocumentBuilder(); 
outDom = (Document) db.parse("<Empty/>"); 
Node fault_node = null; 

和錯誤來自行:

fault_node = (Node) xp.evaluate(Item.XPathFault, outDom, XPathConstants.NODE); 

這是另一個類比項目(HttpServerConnection,如果它的事項),但Item.XPathFault聲明in Item as

public static final String XPathFault = "/" + Soap.EnvelopeBodyFaultXPath; 

Soap包含defi nitions

static final String SoapEnvUri = "http://schemas.xmlsoap.org/soap/envelope/"; 
private static final String SoapNamespaceCheck = "namespace-uri()='" + SoapEnvUri + "' or namespace-uri()=''"; 
static final String EnvelopeXPath = "*[local-name()='Envelope' and (" + SoapNamespaceCheck + ")]"; 
static final String BodyXPath = "*[local-name()='Body' and (" + SoapNamespaceCheck + ")]"; 
static final String FaultXPath = "*[local-name()='Fault' and (" + SoapNamespaceCheck + ")]"; 
static final String EnvelopeBodyXPath = EnvelopeXPath + "/" + BodyXPath; 
static final String EnvelopeBodyFaultXPath = EnvelopeBodyXPath + "/" + FaultXPath; 

的問題是,當我在模擬器上運行的程序,我得到的錯誤:

javax.xml.xpath.XPathExpressionException: javax.xml.transform.TransformerException: Unknown error in XPath. 
    at org.apache.xpath.jaxp.XPathImpl.evaluate(XPathImpl.java:295) 

我想可以走出XPath.evaluate功能是的selectSingleNode,這在JDOM2中不推薦使用,在w3c.dom中不存在。雖然說實話,我不確定我甚至使用了正確的功能。但我知道其中的錯誤是來自於,但我無法弄清楚爲什麼

編輯:我找到了答案

原來我的問題是與代碼db.parse("<Empty/>");和其他類似的聲明。

我誤解了parse的功能。當傳遞一個String時,它假設String是要讀取的XML文件的路徑/位置。當我將實際的XML作爲字符串傳遞給方法時,這導致了一個錯誤。如果parse通過了InputStream,它會將該流的內容作爲XML讀取。

我改變

outDom = (Document) db.parse("<Empty/>"); 

固定我的程序稍長

InputStream is = new ByteArrayInputStream("<Empty />".getBytes()); 
Document outDom = (Document) builder.parse(is); 
+0

您是否嘗試過在所有級聯發生後檢查XPathFault的值?也許這將提供一些見解。 – JLRishe

+0

XPathFault返回爲'/ * [local-name()='Envelope'和(namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'或namespace-uri ='')]/* [local-name()='Body'和(namespace-uri()='http://schemas.xmlsoap.org/soap/envelope/'或namespace-uri ='')]/* [local- name()='Fault'和(namespace-uri()='http://schemas.xmlsoap。org/soap/envelope'or namespace-uri()='')]' 我想要做的是selectSingleNode操作,但該函數在JDOM中不推薦使用,在w3DOM中不存在。 –

回答

0

的XPath尚未在JDOM被棄用,你只需要使用不同的類:

XPathFactory xpfac = XPathFactory.instance(); 
    XPathExpression<Element> xp = xpfac.compile("//title", Filters.element()); 
    List<Element> results = xp.evaluate(doc); 

新類可以支持泛型。