Функция xml.NewEncoder

Функция xml.NewEncoder создает новый экземпляр кодировщика, который записывает XML-представление Go-значений в указанный выходной поток. В качестве параметра функция принимает объект, реализующий интерфейс io.Writer - это может быть, например, os.Stdout, bytes.Buffer или файл. Функция возвращает указатель на структуру Encoder, через которую можно кодировать данные с помощью метода Encode.

Синтаксис

gofunc NewEncoder(w io.Writer) *Encoder

Пример

Давайте создадим кодировщик для вывода XML в стандартный вывод и закодируем простую структуру:

gopackage main

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

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

func main() {
  p := Person{Name: "John", Age: 30}
  encoder := xml.NewEncoder(os.Stdout)
  encoder.Indent("", "  ")
  err := encoder.Encode(p)
  if err != nil {
    fmt.Println("Error:", err)
  }
}

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

go<person>
  <name>John</name>
  <age>30</age>
</person>

Пример

Кодировщик можно использовать для записи XML в буфер и последующего получения строки:

gopackage main

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

type Book struct {
  XMLName xml.Name `xml:"book"`
  Title   string   `xml:"title"`
  Author  string   `xml:"author"`
}

func main() {
  b := Book{Title: "Go Programming", Author: "John Doe"}
  buf := new(bytes.Buffer)
  encoder := xml.NewEncoder(buf)
  encoder.Indent("", "  ")
  err := encoder.Encode(b)
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Printf("%s", buf.String())
}

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

go<book>
  <title>Go Programming</title>
  <author>John Doe</author>
</book>

Пример

Кодировщик поддерживает сериализацию срезов и массивов, создавая множество элементов в XML:

gopackage main

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

type Library struct {
  XMLName xml.Name `xml:"library"`
  Books   []Book   `xml:"book"`
}

type Book struct {
  Title string `xml:"title"`
  Year  int  `xml:"year"`
}

func main() {
  lib := Library{
    Books: []Book{
      {Title: "Book One", Year: 2020},
      {Title: "Book Two", Year: 2021},
    },
  }
  buf := new(bytes.Buffer)
  encoder := xml.NewEncoder(buf)
  encoder.Indent("", "  ")
  err := encoder.Encode(lib)
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Printf("%s", buf.String())
}

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

go<library>
  <book>
  <title>Book One</title>
  <year>2020</year>
  </book>
  <book>
  <title>Book Two</title>
  <year>2021</year>
  </book>
</library>

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

  • функцию xml.Marshal,
    которая преобразует Go-значение в XML-строку без записи в поток
  • функцию xml.Unmarshal,
    которая парсит XML-данные в Go-структуру
  • метод encoder.Encode,
    который выполняет кодирование Go-значения в XML
  • функцию xml.NewDecoder,
    которая создает декодер для чтения XML из потока