Функция xml.MarshalIndent

Функция xml.MarshalIndent преобразует переданную структуру или значение в XML-строку с отступами для удобочитаемости. Она принимает три параметра: значение для сериализации, префикс для каждой новой строки и строку отступа. Возвращает срез байтов с XML-данными и ошибку, если сериализация невозможна.

Синтаксис

goxml.MarshalIndent(v any, prefix, indent string) ([]byte, error)

Пример ⁅n="sect"⁆

Выполним сериализацию структуры с отступом в два пробела:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

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

func main() {
  p := Person{Name: "Alice", Age: 30}
  res, err := xml.MarshalIndent(p, "", "  ")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(res))
}

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

go"<person>
  <name>Alice</name>
  <age>30</age>
</person>"

Пример ⁅n="sect"⁆

Используем префикс для добавления отступов перед каждым тегом:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Item struct {
  XMLName xml.Name `xml:"item"`
  ID    int    `xml:"id"`
  Value   string   `xml:"value"`
}

func main() {
  items := []Item
  res, err := xml.MarshalIndent(items, "  ", "  ")
  if err != nil {
    fmt.Println(err)
    return
  }
  fmt.Println(string(res))
}

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

go"  <item>
    <id>1</id>
    <value>first</value>
  </item>
  <item>
    <id>2</id>
    <value>second</value>
  </item>"

Пример ⁅n="sect"⁆

Обработка ошибки при попытке сериализовать недопустимый тип:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

func main() {
  ch := make(chan int)
  res, err := xml.MarshalIndent(ch, "", "  ")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(string(res))
}

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

go"Error: xml: unsupported type: chan int"

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

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