私は、いくつかの SOAP サービスへのインターフェイスとして機能するコマンド ライン アプリを実行しています。有効な応答を送受信するには、すべての SOAP サービスに独自のフレーム エンベロープがあり、そのフレームにバフ/テキスト/情報を追加する必要があるカスタム xml(エンベロープ) を解析する必要があります。
1コマはこんな感じ。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webPosRo.uaic/">
<soapenv:Body>
<web:parseText_XML>
<rawTextInput>HERE</rawTextInput>
</web:parseText_XML>
</soapenv:Body>
そして、「ここ」を見ると、送信したいコンテンツを配置する必要があります。たとえば、6 つのサービスがあり、サービスごとに 1 つのエンベロープ タイプがあるため、encoding/xml パッケージを使用するのは非常に奇妙です。
そして、それらを渡すために、このような構造体の 6 つの異なるペアを作成する必要があります。
type Envelope struct {
XMLName xml.Name `xml:"Envelope"`
Val1 string `xml:"xmlns:soapenv,attr"`
Val2 string `xml:"xmlns:web,attr"`
CreateBody Body `xml:"soapenv:Body"`
}
type Body struct {
CreateText Text `xml:"web:parseText_XML"`
}
type Text struct {
TextRow []byte `xml:"rawTextInput"`
}
そして、私が別の封筒を持っている場合。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://webNpChunkerRo.uaic/">
<soapenv:Body>
<web:chunkText>
<inputText>
</inputText>
</web:chunkText>
</soapenv:Body>
</soapenv:Envelope>
別の 3 つの構造体ペア タイプがあります。
type Envelope1 struct {
XMLName xml.Name `xml:"Envelope"`
Val1 string `xml:"xmlns:soapenv,attr"`
Val2 string `xml:"xmlns:web,attr"`
CreateBody Body1 `xml:"soapenv:Body"`
}
type Body1 struct {
CreateText Text1 `xml:"web:chunkTest"`
}
type Text1 struct {
TypeRow []byte `xml:"inputText"`
}
そして、私はそれが非常に奇妙だと思います..また、名前空間を持つ最初のノードを解析するために
<soapenv:Envelope ... >
//content
</soapenv:Envelope>
Unmarshall と Marshall の後、取得します
<Envelope ... >
//content
</Envelope>
最初のメモだけがその名前空間「soapenv」を失い、それを完成させるために、このようにサニタイズする関数を作成する必要があります。
func sanitizeEnvelope(buffer []byte) []byte {
var (
StartF = []byte("<Envelope")
FinalF = []byte("</Envelope>")
StartT = []byte("<soapenv:Envelope ")
FinalT = []byte("</soapenv:Envelope>")
)
// Check all the bytes equal to StartF and FinalF
// And replace all with StartT and FinalT
buffer = bytes.Replace(buffer, StartF, StartT, -1)
buffer = bytes.Replace(buffer, FinalF, FinalT, -1)
// return the new sanitize envelope buffer
return buffer
}
これを解析し、その最初のノードの名前空間も含めるより良い解決策はありますか? それとも、上記のようなサニタイズ ソリューションで問題ありませんか?