2010-06-20 47 views
1

使用Grails 1.2.2與1.6.8常規讀.. AA Web服務,並試圖處理響應..的Grails /與Groovy中的XmlSlurper問題..幫助

響應如下所示,並驗證爲正確的XML .. (抱歉長度)..

<soap:Body> 
    <AddProductEventResponse xmlns="http://tempuri.org/"> 
    <AddProductEventResult> 
     <xs:schema id="AddProductEventResult" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
      <xs:element name="AddProductEventResult" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
       <xs:complexType> 
       <xs:choice minOccurs="0" maxOccurs="unbounded"> 
        <xs:element name="AddProductEventResult"> 
         <xs:complexType> 
          <xs:sequence> 
          <xs:element name="ErrorCode" type="xs:string" minOccurs="0"/> 
          <xs:element name="ErrorNumber" type="xs:int" minOccurs="0"/> 
          <xs:element name="ErrorDesc" type="xs:string" minOccurs="0"/> 
          </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
       </xs:choice> 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
     <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
      <AddProductEventResult xmlns=""> 
       <AddProductEventResult diffgr:id="AddProductEventResult1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 
       <ErrorCode>S</ErrorCode> 
       <ErrorNumber>0</ErrorNumber> 
       <ErrorDesc>Success</ErrorDesc> 
       </AddProductEventResult> 
      </AddProductEventResult> 
     </diffgr:diffgram> 
    </AddProductEventResult> 
    </AddProductEventResponse> 
</soap:Body> 
</soap:Envelope> 

我嘗試使用

DEF myXml =新的XmlSlurper()。parseText(結果)

其中結果是上述消息,我解析這個得到一個錯誤...

2010-06-19 06:08:03,665 [http-8080-2] ERROR errors.GrailsExceptionResolver - 文件過早結束。 org.xml.sax.SAXParseException:文件過早結束。 at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231) at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse(SAXParserImpl。 Java的:522)

這是上面的XmlSlurper聲明..

如果我複製並groovyConsole中運行我沒有問題..我創建了一個剝離下來Grails項目 ,並從那裏跑了沒有問題要麼..我有點絕望得到這個排序(發佈在Grails網站上),所以有任何人有任何想法?

回答

0

上面顯示的XML文檔無法驗證。有一個結束標記</soap:Envelope>但沒有相應的開始標記。你確定你在這裏提供完整的XML嗎?

這工作沒有任何異常解析:

<?xml version="1.0"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2001/12/soap-envelope" soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> 
<soap:Body> 
    <AddProductEventResponse xmlns="http://tempuri.org/"> 
    <AddProductEventResult> 
     <xs:schema id="AddProductEventResult" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
      <xs:element name="AddProductEventResult" msdata:IsDataSet="true" msdata:UseCurrentLocale="true"> 
       <xs:complexType> 
       <xs:choice minOccurs="0" maxOccurs="unbounded"> 
        <xs:element name="AddProductEventResult"> 
         <xs:complexType> 
          <xs:sequence> 
          <xs:element name="ErrorCode" type="xs:string" minOccurs="0"/> 
          <xs:element name="ErrorNumber" type="xs:int" minOccurs="0"/> 
          <xs:element name="ErrorDesc" type="xs:string" minOccurs="0"/> 
          </xs:sequence> 
         </xs:complexType> 
        </xs:element> 
       </xs:choice> 
       </xs:complexType> 
      </xs:element> 
     </xs:schema> 
     <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1"> 
      <AddProductEventResult xmlns=""> 
       <AddProductEventResult diffgr:id="AddProductEventResult1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 
       <ErrorCode>S</ErrorCode> 
       <ErrorNumber>0</ErrorNumber> 
       <ErrorDesc>Success</ErrorDesc> 
       </AddProductEventResult> 
      </AddProductEventResult> 
     </diffgr:diffgram> 
    </AddProductEventResult> 
    </AddProductEventResponse> 
</soap:Body> 
</soap:Envelope> 
0

原諒我,我錯過了第一線關閉的事故..應該有

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" mlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

作爲一線..

問題仍然存在,但我已經追蹤到錯誤的東西,看起來真的接種..

在我有一個控制器..

def result = myService.productListService() 

    if (result != "Error") { 

    def xml = new XmlSlurper().parseText(result) 

它拋出我原來的錯誤。在我的服務,我有..

def productListService() { 

.... 

def someList = processRequest(conn, msgBody, "Products") 

return someList 
.... 

} 

和一個輔助方法..

// Helper routines .. 

String processRequest(conn, dataString, serviceName) { 

conn.setRequestMethod("POST") 
conn.doOutput = true 

Writer writer = new OutputStreamWriter(conn.outputStream) 
writer.write(dataString) 
writer.flush() 
writer.close() 
conn.connect() 

if (conn.responseCode == 200 || conn.responseCode == 201){ 
    println "Response .. " 
    println conn.content.text  <--------- Remove this and problem goes away !!! 
    return conn.content.text 
} 

println serviceName + " FAILED .. " 
println conn.responseCode 
println conn.responseMessage 

return "Error" 

}

的XML是conn.content.text變量和幫助我的日常呼應的屏幕進行測試。它也有導致我的問題的不幸副作用!沒有輸出的行一切工作正常,與它我得到上述xmlSlurper錯誤..非常奇怪(對我來說至少)..我不明白..

0

我假設你的康恩。內容是一個InputStream。根據GDK documentation getText()將消耗並關閉流。因此調用它兩次可能會引發異常或返回空字符串。