2010-06-20 8 views
1

utilisant Grails 1.2.2 avec Groovy 1.6.8 .. La lecture aa service web et d'essayer de traiter la réponse ../Grails problème avec Groovy XmlSlurper .. aider

réponse est indiqué ci-dessous et valide comme correcte xml .. (désolé pour la longueur) ..

<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> 

J'essaie d'analyser cela en utilisant

def myXML = new XmlSlurper(). parseText (résultat)

où résultat est le message ci-dessus et i obtenir une erreur ...

2010-06-19 06: 08: 03,665 [http-8080-2] ERROR errors.GrailsExceptionResolver - Fin prématurée du fichier. org.xml.sax.SAXParseException: fin prématurée du fichier. at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse (AbstractSAXParser.java:1231) à l'adresse com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl $ JAXPSAXParser.parse (SAXParserImpl. java: 522)

qui est la déclaration de XmlSlurper ci-dessus ..

Si je copier et exécuter à partir groovyConsole je n'ai pas le problème .. Je créé un projet Grails dépouillé et a couru de là sans problèmes soit .. je deviens un peu désespéré pour obtenir ce tri (ont posté sur le site Grails à) donc quelqu'un a une idée?

Répondre

0

Le document XML ci-dessus ne peut pas être validé. Il existe une balise de fin </soap:Envelope> mais aucune balise de début correspondante. Êtes-vous sûr de fournir le code XML complet ici?

Cela fonctionne sans exception d'analyse syntaxique:

<?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

Pardonnez-moi, j'ai raté la première ligne par accident .. aurait dû avoir

<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"> 

en première ligne ..

problème reste encore MAIS j'ai retracé l'erreur à quelque chose qui semble vraiment inocc ..

Dans un contrôleur j'ai ..

def result = myService.productListService() 

    if (result != "Error") { 

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

qui jette mon erreur originale. Dans mon service j'ai ..

def productListService() { 

.... 

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

return someList 
.... 

} 

et une méthode d'assistance ..

// 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" 

}

Le xml est la variable conn.content.text et ma routine d'aide fait écho à la écran pour tester. Il a aussi l'effet secondaire malheureux d'être la cause de mon problème! Sans la sortie de la ligne tout fonctionne bien, avec je reçois l'erreur xmlSlurper précitée .. très étrange (pour moi au moins) .. Je ne comprends pas que ..

0

Je suppose que votre conn. le contenu est un InputStream.Selon le GDK documentation getText() utilisera et fermera le flux. L'appeler deux fois serait donc probablement soit jeter une exception ou retourner une chaîne vide.