Теги xml

Теги xml в Go используются для управления процессом сериализации и десериализации структур в формат XML. Они позволяют задавать имена элементов, атрибутов, управлять вложенностью и обрабатывать специальные случаи. Теги записываются в виде строки после типа поля в структуре и имеют формат `xml:"имя,опции"`, где имя определяет название элемента в XML, а опции задают дополнительное поведение.

Синтаксис

gotype StructName struct {
  FieldName string `xml:"elementName,attr"`
}

Основной синтаксис тега состоит из имени элемента и опциональных опций, разделенных запятыми. Имя может быть опущено, тогда используется имя поля. Поддерживаются следующие опции: attr (поле становится атрибутом), chardata (поле становится текстовым содержимым), omitempty (поле пропускается, если его значение нулевое), any (поле содержит произвольные XML-данные).

Пример

Давайте создадим структуру с тегами для управления именами элементов:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Person struct {
  XMLName xml.Name `xml:"person"`
  FirstName string `xml:"firstName"`
  LastName  string `xml:"lastName"`
  Age     int  `xml:"age"`
}

func main() {
  p := Person{
    FirstName: "John",
    LastName:  "Doe",
    Age:     30,
  }

  res, err := xml.MarshalIndent(p, "", "  ")
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Println(string(res))
}

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

go"<person>
  <firstName>John</firstName>
  <lastName>Doe</lastName>
  <age>30</age>
</person>"

Пример

Давайте рассмотрим использование опции attr для создания атрибутов XML:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Product struct {
  XMLName xml.Name `xml:"product"`
  ID    string   `xml:"id,attr"`
  Name  string   `xml:"name"`
  Price   float64  `xml:"price"`
}

func main() {
  prod := Product{
    ID:  "A123",
    Name:  "Laptop",
    Price: 999.99,
  }

  res, err := xml.MarshalIndent(prod, "", "  ")
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Println(string(res))
}

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

go"<product id=\"A123\">
  <name>Laptop</name>
  <price>999.99</price>
</product>"

Пример

Использование опции omitempty для пропуска нулевых полей:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Book struct {
  XMLName xml.Name `xml:"book"`
  Title   string   `xml:"title"`
  Author  string   `xml:"author,omitempty"`
  Year  int    `xml:"year,omitempty"`
}

func main() {
  book := Book{
    Title: "Go Programming",
  }

  res, err := xml.MarshalIndent(book, "", "  ")
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Println(string(res))
}

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

go"<book>
  <title>Go Programming</title>
</book>"

Пример

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

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type TextElement struct {
  XMLName xml.Name `xml:"element"`
  Content string   `xml:",chardata"`
  ID    string   `xml:"id,attr"`
}

func main() {
  el := TextElement{
    Content: "Some text content",
    ID:    "123",
  }

  res, err := xml.MarshalIndent(el, "", "  ")
  if err != nil {
    fmt.Println("Error:", err)
  }
  fmt.Println(string(res))
}

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

go"<element id=\"123\">Some text content</element>"

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

  • функцию xml.Marshal,
    которая выполняет сериализацию структуры в XML
  • функцию xml.Unmarshal,
    которая выполняет десериализацию XML в структуру
  • функцию xml.MarshalIndent,
    которая сериализует с форматированием отступов
  • тип xml.Name,
    который представляет имя XML-элемента