1

groovy 1.6.8でgrails 1.2.2を使用.. 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)

result は上記のメッセージで、エラーが発生します...

2010-06-19 06:08:03,665 [http-8080-2] ERROR エラー。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 に投稿しました)サイトへ)なので、誰か何か考えがありますか?

4

3 に答える 3

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エラーが発生します..非常に奇妙です(少なくとも私には)..わかりません..

于 2010-06-20T22:37:30.163 に答える
0

conn.contentが InputStream であると想定しています。GDK のドキュメントによると、getText() はストリームを消費して閉じます。したがって、2 回呼び出すと、ほとんどの場合、例外がスローされるか、空の文字列が返されます。

于 2011-01-14T09:05:20.097 に答える
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>
于 2010-06-20T15:43:25.760 に答える