【问题标题】:Grails/Groovy problem with XmlSlurper .. helpXmlSlurper 的 Grails/Groovy 问题 .. 帮助
【发布时间】:2010-06-20 11:05:14
【问题描述】:

将 grails 1.2.2 与 groovy 1.6.8 结合使用 .. 读取 Web 服务并尝试处理响应 ..

响应如下所示,并验证为正确的 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 = new XmlSlurper().parseText(result)

结果是上面的消息,我得到一个错误......

2010-06-19 06:08:03,665 [http-8080-2] 错误错误。GrailsExceptionResolver - 文件过早结束。 org.xml.sax.SAXParseException:文件过早结束。 在 com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1231) 在 com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:522)

也就是上面的xmlSlurper语句..

如果我从 groovyConsole 复制并运行,我没有问题 .. 我创建了一个精简的 Grails 项目 并且从那里运行它也没有问题..我有点绝望地想要得到这个排序(已经发布在 Grails 网站上)所以有人知道吗?

【问题讨论】:

    标签: grails groovy xmlslurper


    【解决方案1】:

    无法验证上面显示的 XML 文档。有一个结束标签&lt;/soap:Envelope&gt;,但没有相应的开始标签。你确定你在这里提供了完整的 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>
    

    【讨论】:

      【解决方案2】:

      原谅我,我不小心错过了第一行..应该有

      <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 错误.. 很奇怪(至少对我来说).. 我不明白..

      【讨论】:

        【解决方案3】:

        我假设您的 conn.content 是 InputStream。根据GDK documentation getText() 将消耗并关闭流。因此,调用它两次很可能会引发异常或返回空字符串。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-01-24
          • 1970-01-01
          相关资源
          最近更新 更多