2010-11-09 65 views
0

我試圖在Eclipse Galileo中運行的junit測試中從Web服務調用中讀取響應。我能夠成功接收響應,除非響應是SOAP錯誤。然後我得到以下異常: org.xml.sax.SAXParseException:元素類型「SOAP:文本」必須遵循的任一屬性規範「>」或「/>」SAXParseException:元素類型SOAP:文本必須後跟屬性規範,「>」或「/>」

我已經驗證了XML在LiquidXML Studio中針對SOAP 1.2模式進行檢查。

這是SAX似乎令人窒息的XML響應。它已被剝離到最低限度,企圖消除任何明顯的(我甚至確信它沒有任何自我封閉元素):

<SOAP:Envelope xmlns:SOAP="http://www.w3.org/2003/05/soap-envelope" xmlns:SOAP_ENC="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP:Header> </SOAP:Header> <SOAP:Body> <SOAP:Fault> <SOAP:Code> <SOAP:Value>SOAP:Sender</SOAP:Value> <SOAP:Subcode> <SOAP:Value>SOAP:Sender</SOAP:Value> </SOAP:Subcode> </SOAP:Code> <SOAP:Reason> <SOAP:Text xml:lang=""> </SOAP:Text> </SOAP:Reason> <SOAP:Node> </SOAP:Node> <SOAP:Role> </SOAP:Role> <SOAP:Detail> </SOAP:Detail> </SOAP:Fault> </SOAP:Body> </SOAP:Envelope>

任何幫助,將不勝感激。

回答

0

它顯然不能識別'xml:lang =「」'作爲屬性。用你的xsd或xmlSchema查找哪些屬性是有效的。你也應該使用

xml:lang=&quot;&quot; 

而不是「」,雖然大多數解析器原諒你。

+0

Envelope中引用的模式確實包含Text元素的xml:lang屬性,這就是爲什麼我提到了在LiquidXML Studio中針對模式進行驗證的原因。有效的響應和SOAP錯誤包括引號字符,所以我知道這不是問題。感謝resoponse。 – Jeff 2010-11-09 04:43:49

0

我認爲問題在於將soap fault xml映射到其相應的對象。

+0

您可以更具體地瞭解什麼是映射到這裏?乍一看,它似乎是一個直接的模式驗證或無效的角色問題。謝謝。 – Jeff 2010-11-09 04:45:21

+0

通常,當您獲取xml時,您需要使用模式將其轉換回對象。所以你的XML數據,XML模式和對象需要同步才能使解析工作。此外,您的XML模式需要能夠處理正確的響應以及肥皂故障(這有時是棘手的)。 – avicene 2010-11-09 05:02:08

+0

此過程不包含對象。我只是想取回字符串響應來檢查它。我之前已經處理了SOAP錯誤,但沒有使用SAX解析器,並且從來沒有遇到任何問題。 – Jeff 2010-11-09 05:12:09

0

事實證明,這個問題與我用來向Web服務請求返回靜態字符串響應的工具有關。靜態響應XML包含xml:lang屬性。但是,當該工具返回靜態字符串時,它正在修改它,並用完全限定的名稱空間替換xml:lang,該名稱空間等同於{http://www.w3.org/XML/1998/命名空間}郎。當收到此回覆時,SAXParser窒息,因爲它無法解釋完全合格的等價物。

返回靜態響應的工具使用Groovy xml解析器作爲發送響應的組成部分。 XmlParser Groovy類有一個構造函數,我必須更改設置validating和namespaceAware屬性爲false。因此,而不是XmlParser(),該工具現在調用XmlParser(false,false)。 問題解決了。 感謝您的回覆。

相關問題