問題:
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>
説明:
使用法:
<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 サイトの他の関連記事を参照してください。