Golang でアンマーシャリング中に XML 配列内のすべての要素をキャプチャする方法

Patricia Arquette
リリース: 2024-10-24 06:16:02
オリジナル
976 人が閲覧しました

How to Capture All Elements in an XML Array During Unmarshaling in Golang?

Golang ですべての要素をキャプチャするための XML 配列のアンマーシャリング

問題:

XML 配列を構造体にアンマーシャリングするとき、配列の最初の要素のみが取得されます。

元のコード:

<code class="go">type HostSystemIdentificationInfo []struct {
    IdentiferValue string `xml:"identifierValue"`
    IdentiferType  struct {
        Label   string `xml:"label"`
        Summary string `xml:"summary"`
        Key     string `xml:"key"`
    } `xml:"identifierType"`
}

func unmarshal(xmlBytes []byte) (HostSystemIdentificationInfo, error) {
    var t HostSystemIdentificationInfo
    err := xml.Unmarshal(xmlBytes, &t)
    return t, err
}</code>
ログイン後にコピー

問題:

上記コードは XML 文字列を構造体 HostSystemIdentificationInfo のスライスにアンマーシャリングしようとしますが、配列の最初の要素のみがキャプチャされます。

解決策:

配列のすべての要素をキャプチャするにはXML 配列を使用するには、XML デコーダを使用し、その Decode メソッドを複数回呼び出す必要があります。以下のコードは、これを実現する方法を示しています。

<code class="go">// ... (same struct definitions as in the original code)

func unmarshal(xmlBytes []byte) (HostSystemIdentificationInfo, error) {
    dec := xml.NewDecoder(bytes.NewReader(xmlBytes))
    var t HostSystemIdentificationInfo
    for {
        err := dec.Decode(&t)
        if err == io.EOF {
            break
        }
        if err != nil {
            return nil, err
        }
    }
    return t, nil
}</code>
ログイン後にコピー

説明:

  • xml.NewDecoder 関数は、IO から読み取る新しい XML デコーダーを作成します。 .Reader.
  • for ループは XML 入力を繰り返し、各要素を t スライスにデコードします。
  • dec.Decode(&t) メソッドは、次の XML 要素を変数 t にデコードします。
  • ループはファイルの終わり (EOF) に達するまで続き、すべての要素が処理されたことを示します。

使用法:

<code class="go">xmlBytes = []byte(`
<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue>...</identifierValue>
  <identifierType>...</identifierType>
</HostSystemIdentificationInfo>
<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue>...</identifierValue>
  <identifierType>...</identifierType>
</HostSystemIdentificationInfo>
`)

t, err := unmarshal(xmlBytes)
if err != nil {
    log.Fatal(err)
}

fmt.Println(t) // All elements of the XML array will be printed</code>
ログイン後にコピー

以上がGolang でアンマーシャリング中に XML 配列内のすべての要素をキャプチャする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート