我使用org.w3c.dom
庫將XML Elements
和Documents
存儲在我製作的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);
您是否嘗試過在所有級聯發生後檢查XPathFault的值?也許這將提供一些見解。 – JLRishe
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中不存在。 –