Теги xml
Теги xml в Go используются для управления процессом сериализации и десериализации структур в формат XML. Они позволяют задавать имена элементов, атрибутов, управлять вложенностью и обрабатывать специальные случаи. Теги записываются в виде строки после типа поля в структуре и имеют формат `xml:"имя,опции"`, где имя определяет название элемента в XML, а опции задают дополнительное поведение.
Синтаксис
type StructName struct {
FieldName string `xml:"elementName,attr"`
}
Основной синтаксис тега состоит из имени элемента и опциональных опций, разделенных запятыми. Имя может быть опущено, тогда используется имя поля. Поддерживаются следующие опции: attr (поле становится атрибутом), chardata (поле становится текстовым содержимым), omitempty (поле пропускается, если его значение нулевое), any (поле содержит произвольные XML-данные).
Пример
Давайте создадим структуру с тегами для управления именами элементов:
package 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))
}
Результат выполнения кода:
"<person>
<firstName>John</firstName>
<lastName>Doe</lastName>
<age>30</age>
</person>"
Пример
Давайте рассмотрим использование опции attr для создания атрибутов XML:
package 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))
}
Результат выполнения кода:
"<product id=\"A123\">
<name>Laptop</name>
<price>999.99</price>
</product>"
Пример
Использование опции omitempty для пропуска нулевых полей:
package 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))
}
Результат выполнения кода:
"<book>
<title>Go Programming</title>
</book>"
Пример
Использование опции chardata для работы с текстовым содержимым:
package 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))
}
Результат выполнения кода:
"<element id=\"123\">Some text content</element>"
Смотрите также
-
функцию
xml.Marshal,
которая выполняет сериализацию структуры в XML -
функцию
xml.Unmarshal,
которая выполняет десериализацию XML в структуру -
функцию
xml.MarshalIndent,
которая сериализует с форматированием отступов -
тип
xml.Name,
который представляет имя XML-элемента