Grails / Groovy проблема с XmlSlurper .. помочь - PullRequest
1 голос
/ 20 июня 2010

Использование grails 1.2.2 с groovy 1.6.8 .. Чтение веб-службы и попытка обработки ответа.

Ответ показан ниже и проверяется как правильный 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.parsel (SAX522)

, что является приведенным выше оператором xmlSlurper ..

Если я копирую и запускаю из groovyConsole, у меня нет проблемы .. Я создал урезанный проект Grails и запустил его оттудалибо без проблем .. Я становлюсь немного отчаянным, чтобы отсортировать это (разместил на сайте Grails), так что у кого-нибудь есть идеи?

Ответы [ 3 ]

0 голосов
/ 21 июня 2010

Простите, я пропустил первую строчку случайно ... должен был иметь

<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 голосов
/ 14 января 2011

Я предполагаю, что ваше conn.content является InputStream. Согласно документации GDK getText () будет использовать и закрывать поток. Таким образом, его повторный вызов, скорее всего, вызовет исключение или вернет пустую строку.

0 голосов
/ 20 июня 2010

Показанный выше 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>
...