Функция xml.NewDecoder

Функция xml.NewDecoder создает новый декодер, который читает XML-данные из переданного io.Reader. В качестве единственного параметра она принимает объект, реализующий интерфейс io.Reader, например, файл, сетевой сокет или строку, преобразованную в strings.Reader. Возвращает указатель на структуру xml.Decoder, с помощью которого можно последовательно читать XML-токены или сразу декодировать данные в структуру.

Синтаксис

gofunc NewDecoder(r io.Reader) *Decoder

Пример

Базовый пример создания декодера из строки с XML:

gopackage main

import (
  "encoding/xml"
  "fmt"
  "strings"
)

func main() {
  xmlData := `<root><name>John</name><age>30</age></root>`
  reader := strings.NewReader(xmlData)
  decoder := xml.NewDecoder(reader)
  fmt.Printf("%T", decoder)
}

Результат выполнения кода:

go*xml.Decoder

Пример

Декодирование XML в структуру с использованием Decoder.Decode:

gopackage main

import (
  "encoding/xml"
  "fmt"
  "strings"
)

type Person struct {
  XMLName xml.Name `xml:"root"`
  Name  string   `xml:"name"`
  Age   int    `xml:"age"`
}

func main() {
  xmlData := `<root><name>Jane</name><age>25</age></root>`
  decoder := xml.NewDecoder(strings.NewReader(xmlData))

  var p Person
  err := decoder.Decode(&p)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  
  fmt.Printf("Name: %s, Age: %d", p.Name, p.Age)
}

Результат выполнения кода:

go"Name: Jane, Age: 25"

Пример

Использование Decoder.DecodeElement для декодирования с настройками:

gopackage main

import (
  "encoding/xml"
  "fmt"
  "strings"
)

type Item struct {
  Name  string `xml:"name"`
  Value int  `xml:"value"`
}

func main() {
  xmlData := `<root><item><name>Apple</name><value>50</value></item></root>`
  decoder := xml.NewDecoder(strings.NewReader(xmlData))

  // Поиск элемента <item>
  for {
    token, err := decoder.Token()
    if err != nil {
      break
    }
    
    switch se := token.(type) {
    case xml.StartElement:
      if se.Name.Local == "item" {
        var item Item
        decoder.DecodeElement(&item, &se)
        fmt.Printf("Item: %s, Value: %d", item.Name, item.Value)
      }
    }
  }
}

Результат выполнения кода:

go"Item: Apple, Value: 50"

Смотрите также

  • функцию xml.NewEncoder,
    которая создает энкодер для записи XML
  • функцию xml.Unmarshal,
    которая декодирует XML из среза байтов
  • функцию xml.Marshal,
    которая кодирует структуру в XML
  • метод Decoder.Decode,
    который читает следующий XML-элемент в структуру