«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как получить все элементы XML-массива в Golang, не ограничиваясь только первым элементом?

Как получить все элементы XML-массива в Golang, не ограничиваясь только первым элементом?

Опубликовано 9 ноября 2024 г.
Просматривать:486

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

Демаршалинг элементов массива в XML: получение всех элементов, а не только первых

При демаршалинге XML-массива в Golang с использованием xml.Unmarshal( []byte(p.Val.Inner), &t), вы можете столкнуться с ситуацией, когда извлекается только первый элемент. Чтобы решить эту проблему, используйте xml.Decoder и повторно вызывайте его метод Decode.

Действия по демаршалированию всех элементов массива XML:

  1. Создайте новый XML. Декодер с использованием xml.NewDecoder(bytes.NewBufferString(VV)), где VV — это строка XML, содержащая элементы массива.
  2. Введите цикл для обработки каждого элемента XML:
  3. Объявите переменную t типа целевого среза (например, HostSystemIdentificationInfo).
  4. Вызовите 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