Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk Menangkap Semua Elemen dalam Tatasusunan XML Semasa Unmarshaling di Golang?

Bagaimana untuk Menangkap Semua Elemen dalam Tatasusunan XML Semasa Unmarshaling di Golang?

Patricia Arquette
Patricia Arquetteasal
2024-10-24 06:16:02903semak imbas

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

Menyahmarshaling Tatasusunan XML untuk Menangkap Semua Elemen dalam Golang

Masalah:

Apabila menyahmarshaling tatasusunan XML ke dalam struct, hanya elemen pertama tatasusunan diambil semula.

Kod Asal:

<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>

Isu:

Yang di atas kod cuba untuk menyahmarshal rentetan XML ke dalam kepingan struct HostSystemIdentificationInfo, tetapi ia hanya menangkap elemen pertama tatasusunan.

Penyelesaian:

Untuk menangkap semua elemen tatasusunan XML, anda perlu menggunakan penyahkod XML dan memanggil kaedah Nyahkodnya beberapa kali. Kod di bawah menunjukkan cara untuk mencapai ini:

<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>

Penjelasan:

  • Fungsi xml.NewDecoder mencipta penyahkod XML baharu yang membaca daripada io .Pembaca.
  • Gelung for berulang pada input XML, menyahkod setiap elemen ke dalam kepingan t.
  • Kaedah dec.Decode(&t) menyahkod elemen XML seterusnya ke dalam pembolehubah t.
  • Gelung berterusan sehingga akhir fail (EOF) dicapai, menunjukkan bahawa semua elemen telah diproses.

Penggunaan:

<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>

Atas ialah kandungan terperinci Bagaimana untuk Menangkap Semua Elemen dalam Tatasusunan XML Semasa Unmarshaling di Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn