的Grails /与Groovy中的XmlSlurper问题..帮助
使用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网站上),所以有任何人有任何想法?
上面显示的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>
原谅我,我错过了第一线关闭的事故..应该有
<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错误..非常奇怪(对我来说至少)..我不明白..