Метод xml.Encoder.Encode

Метод xml.Encoder.Encode выполняет сериализацию переданных данных в формат XML и записывает результат в выходной поток, связанный с экземпляром xml.Encoder. В качестве аргумента метод принимает произвольное значение типа any. Обычно это структура с тегами xml, управляющими формированием элементов и атрибутов. При успешной записи метод возвращает nil, в противном случае — ошибку.

Синтаксис

goerr := encoder.Encode(v)

Пример

Создадим структуру Person, заполним её данными и сериализуем в XML-строку с помощью xml.Encoder.Encode:

gopackage main

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

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

func main() {
  p := Person{
    Name: "John",
    Age:  30,
  }

  var buf bytes.Buffer
  enc := xml.NewEncoder(&buf)
  enc.Indent("", "  ")

  err := enc.Encode(p)
  if err != nil {
    fmt.Printf("error: %v\n", err)
    return
  }

  fmt.Println(buf.String())
}

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

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

Пример

Покажем, как метод обрабатывает вложенные структуры и XML-атрибуты, заданные через теги xml:

gopackage main

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

type Address struct {
  City  string `xml:"city"`
  Street  string `xml:"street"`
}

type Employee struct {
  XMLName xml.Name `xml:"employee"`
  ID    int    `xml:"id,attr"`
  FullName string  `xml:"fullname"`
  Address  Address `xml:"address"`
}

func main() {
  e := Employee{
    ID:     1001,
    FullName: "Jane Doe",
    Address: Address{
      City:   "New York",
      Street: "5th Ave",
    },
  }

  var buf bytes.Buffer
  enc := xml.NewEncoder(&buf)
  enc.Indent("", "  ")

  err := enc.Encode(e)
  if err != nil {
    fmt.Printf("error: %v\n", err)
    return
  }

  fmt.Println(buf.String())
}

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

go<employee id="1001">
  <fullname>Jane Doe</fullname>
  <address>
  <city>New York</city>
  <street>5th Ave</street>
  </address>
</employee>

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

  • функцию xml.Marshal,
    которая сериализует данные в XML и возвращает срез байт
  • функцию xml.MarshalIndent,
    которая делает то же самое с отступами
  • функцию xml.Unmarshal,
    которая десериализует XML в структуру Go
  • тип xml.Encoder,
    который управляет всем процессом записи XML