1

私は、いくつかの 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
}

これを解析し、その最初のノードの名前空間も含めるより良い解決策はありますか? それとも、上記のようなサニタイズ ソリューションで問題ありませんか?

4

1 に答える 1

0

私が見る限り、エンベロープは(解析/スキーマの観点から)同じであるため、構造体の埋め込みを使用して構造体の量を減らすことができます。

構造体の量をさらに減らすには、>構造体タグで構文を使用して、ネストされた構造体フィールドを一度にラップします ( xml.Marshalxml.Unmarshal ) 。

type Envelope struct {
     XMLName    xml.Name `xml:"Envelope"`
     Val1       string   `xml:"xmlns:soapenv,attr"`
     Val2       string   `xml:"xmlns:web,attr"`
}

type Msg1 struct {
     Envelope 
     Input string `xml:"soapenv:Body>web:chunkTest>inputText"`
}

これを完全にテストしたわけではありませんが、始めるには十分なはずです。

于 2015-12-18T01:27:11.663 に答える