XmlSlurperが明らかに結果に作用していない理由を理解できません。Groovy HTTPBuilder SOAP応答が適切に解析されない
import groovyx.net.http.*
import static groovyx.net.http.ContentType.*
import static groovyx.net.http.Method.*
def String WSDL_URL = ...
def http = new HTTPBuilder(WSDL_URL , ContentType.XML)
String soapEnvelope =
"""<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetTerritories xmlns="...">
<State>AZ</State>
<ZipCode>85203</ZipCode>
</GetTerritories>
</soap12:Body>
</soap12:Envelope>"""
http.request(POST, XML) {
headers."Content-Type" = "application/soap+xml; charset=utf-8"
headers."Accept" = "application/soap+xml; charset=utf-8"
body = soapEnvelope
response.success = { resp, xml ->
println "XML was ${xml}"
println "Territories were ${xml.Territories}"
println "State were ${xml.Territories.State}"
println "City was ${xml.Territories.Territory.City}"
println "County was ${xml.Territories.Territory.County}"
}
response.failure = { resp, xml ->
xml
}
}
は
XML was <Territories><State>AZ</State><ZipCode>85203</ZipCode><Territory><City>Mesa</City><County>Maricopa</County>...</Territory></Territories>
Territories were
State were
City was
County was
UPDATEにつながる:ジョン・Wagenleitnerの洞察力のおかげで、私はもう少し掘りをしました。
私はそのアサートを追加すると、私は問題を参照してください。POST, XML
からPOST, TEXT
にリクエストパラメータを変更
assert "Territories" == xml.name()
| | |
| | Envelope
| <Territories><State>AZ</State><ZipCode>85203</ZipCode</Territories>
false
が明らかにされています
XML was <?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
xmlns:soap="http://www.w3.org/2003/05/soap-envelope"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<GetTerritoriesResponse xmlns="...">
<GetTerritoriesResult><Territories><State>AZ</State><ZipCode>85203</ZipCode><Territory><City>Mesa</City><County>Maricopa</County>...</Territory></Territories>
</GetTerritoriesResult>
</GetTerritoriesResponse>
</soap:Body>
</soap:Envelope>
を...
だから、それが見えますXmlSlurperのように、変数が出力されているときに、SOAPのものを投げ捨て、実際にはナビゲートしていない最内側のノード()を評価していますそのノード。これは予想される動作ですか?
私はより完全で最新のSOAP呼び出しを見つけられず、httpBuilderを使用して解析しています。したがって、XMLが正しいコンテンツタイプであると仮定しました。しかし、私はTEXTを受け入れて自分自身を解析しなければならないように見えますが、これは不自然なようです。 httpBuilderでSOAP応答を処理するより良い方法はありますか?
ありがとう、このコメントは非常に役に立ちました。私がScott DavisのGroovy Recipesについて読んだところから、text()はXmlSlurperではなく、XmlParser用であると思った。私は$ {xml}と$ {xml.name()}のプリントアウトの不一致に悩まされています。なぜそれがそれをやっているのか分かりますか? –
xml GPathResultを印刷すると、タグは表示されず、テキストコンテンツだけが表示されるため、見た結果が表示されます。 –
GPathResultでtext()を呼び出すと、その要素のテキスト内容のStringが返されます。 printlnのようなことをするときは、GPathResultのtoString()メソッドが要素のテキスト内容を出力するので、通常は厳密には必要ありません。 –