「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 最初の要素だけに限定せずに、Golang で XML 配列内のすべての要素を取得する方法

最初の要素だけに限定せずに、Golang で XML 配列内のすべての要素を取得する方法

2024 年 11 月 9 日に公開
ブラウズ:695

How to Retrieve All Elements in an XML Array in Golang without Limiting to Just the First Element?

XML の配列要素のアンマーシャリング: 最初の要素だけでなくすべての要素を取得する

xml.Unmarshal( を使用して Golang で XML 配列をアンマーシャリングする場合[]byte(p.Val.Inner), &t) を使用すると、最初の要素のみが取得される状況が発生する可能性があります。この問題を解決するには、xml.Decoder を利用し、その Decode メソッドを繰り返し呼び出します。

すべての XML 配列要素をアンマーシャルする手順:

  1. 新しい xml を作成します。 xml.NewDecoder(bytes.NewBufferString(VV)) を使用したデコーダ。VV は配列を含む XML 文字列です。 elements.
  2. 各 XML 要素を処理するループに入ります:
  3. ターゲット スライス タイプ (HostSystemIdentificationInfo など) の変数 t を宣言します。
  4. Call d.Decode(&t ) 次の XML 要素を t 変数にアンマーシャリングします。
  5. ステップ 2 ~ 4 を繰り返します。 d.Decode(&t) 呼び出しは io.EOF.

修正された Golang コード:

package main

import (
    "bytes"
    "encoding/xml"
    "fmt"
    "io"
    "log"
)

type HostSystemIdentificationInfo []struct {
    IdentiferValue string `xml:"identifierValue"`
    IdentiferType  struct {
        Label   string `xml:"label"`
        Summary string `xml:"summary"`
        Key     string `xml:"key"`
    } `xml:"identifierType"`
}

func main() {
    d := xml.NewDecoder(bytes.NewBufferString(VV))
    for {
        var t HostSystemIdentificationInfo
        err := d.Decode(&t)
        if err == io.EOF {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(t)
    }
}

const VV = `<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue> unknown</identifierValue>
  <identifierType>
    <label>Asset Tag</label>
    <summary>Asset tag of the system</summary>
    <key>AssetTag</key>
  </identifierType>
</HostSystemIdentificationInfo>
<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue>Dell System</identifierValue>
  <identifierType>
    <label>OEM specific string</label>
    <summary>OEM specific string</summary>
    <key>OemSpecificString</key>
  </identifierType>
</HostSystemIdentificationInfo>
<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue>5[0000]</identifierValue>
  <identifierType>
    <label>OEM specific string</label>
    <summary>OEM specific string</summary>
    <key>OemSpecificString</key>
  </identifierType>
</HostSystemIdentificationInfo>
<HostSystemIdentificationInfo xsi:type="HostSystemIdentificationInfo">
  <identifierValue>REDACTED</identifierValue>
  <identifierType>
    <label>Service tag</label>
    <summary>Service tag of the system</summary>
    <key>ServiceTag</key>
  </identifierType>
</HostSystemIdentificationInfo>`

サンプル出力:

[{ unknown {Asset Tag Asset tag of the system AssetTag}}]
[{Dell System {OEM specific string OEM specific string OemSpecificString}}]
[{5[0000] {OEM specific string OEM specific string OemSpecificString}}]
[{REDACTED {Service tag Service tag of the system ServiceTag}}]

xml.Decoder を使用し、Decode を繰り返し呼び出すことにより、XML 配列内のすべての要素を正常に取得でき、最初の要素のみを取得する問題を解決できます。要素。

リリースステートメント この記事は次の場所に転載されています: 1729695196 権利侵害がある場合は、[email protected] に連絡して削除してください。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3