XmlSlurper的Grails / Groovy问题..帮助

时间:2010-06-20 11:05:14

标签: grails groovy xmlslurper

将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] ERROR errors.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网站上)所以有人有任何想法吗?

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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错误..非常奇怪(至少对我来说)..我不明白..

答案 2 :(得分:0)

我假设您的 conn.content 是一个InputStream。根据{{​​3}} getText()将消耗并关闭流。因此,调用它两次很可能会抛出异常或返回一个空字符串。