Работа с XML в Go (Golang): подробное руководство по пакету encoding/xml
В современной разработке на Go (Golang) задача обработки XML-данных встречается достаточно часто — от интеграции с устаревшими системами до обмена данными в SOAP-сервисах. Стандартная библиотека Go предоставляет мощный и гибкий пакет encoding/xml, который позволяет эффективно парсить, создавать и преобразовывать XML-документы. В этой статье мы подробно разберем все ключевые возможности работы с XML в Go.
Основные возможности пакета encoding/xml
Пакет encoding/xml реализует простой интерфейс для сериализации (маршалинга) структур Go в XML и десериализации (анмаршалинга) XML обратно в структуры. Он поддерживает:
- Преобразование структур Go в XML-документы и обратно
- Работу с атрибутами, вложенными элементами и пространствами имен
- Потоковый парсинг больших XML-файлов через
xml.Decoder - Настраиваемые правила сериализации с помощью тегов структур
Установка и импорт пакета
Пакет encoding/xml входит в стандартную библиотеку Go, поэтому дополнительная установка не требуется. Для использования достаточно импортировать его:
import (
"encoding/xml"
"fmt"
"os"
)
Маршалинг: структура Go → XML
Для преобразования структуры Go в XML используется функция xml.Marshal() или xml.MarshalIndent() для форматированного вывода. Рассмотрим пример:
type Person struct {
XMLName xml.Name `xml:"person"`
ID int `xml:"id,attr"`
FirstName string `xml:"name>first"`
LastName string `xml:"name>last"`
Age int `xml:"age"`
}
func main() {
p := Person{
ID: 123,
FirstName: "Иван",
LastName: "Петров",
Age: 30,
}
output, err := xml.MarshalIndent(p, "", " ")
if err != nil {
fmt.Printf("Ошибка маршалинга: %v\n", err)
return
}
fmt.Println(string(output))
}
Результат выполнения:
<person id="123">
<name>
<first>Иван</first>
<last>Петров</last>
</name>
<age>30</age>
</person>
Анмаршалинг: XML → структура Go
Обратный процесс — преобразование XML-данных в структуру Go — выполняется с помощью xml.Unmarshal():
func unmarshalExample() {
xmlData := `<person id="456">
<name>
<first>Мария</first>
<last>Сидорова</last>
</name>
<age>25</age>
</person>`
var p Person
err := xml.Unmarshal([]byte(xmlData), &p)
if err != nil {
fmt.Printf("Ошибка анмаршалинга: %v\n", err)
return
}
fmt.Printf("ID: %d, Имя: %s %s, Возраст: %d\n", p.ID, p.FirstName, p.LastName, p.Age)
// Вывод: ID: 456, Имя: Мария Сидорова, Возраст: 25
}
Работа с атрибутами и вложенными элементами
Пакет encoding/xml использует теги структур для управления отображением. Основные директивы тегов:
xml:"name"— имя элементаxml:"name,attr"— атрибут элементаxml:"parent>child"— вложенный элементxml:",chardata"— текстовое содержимоеxml:",innerxml"— сырой XML внутри элементаxml:",comment"— комментарий XMLxml:"-"— игнорировать поле
Потоковый парсинг больших XML-файлов
Для обработки больших XML-документов (например, файлов размером в гигабайты) используется потоковый парсер xml.Decoder. Это позволяет не загружать весь документ в память:
type Book struct {
Title string `xml:"title"`
Author string `xml:"author"`
Year int `xml:"year"`
}
func parseLargeXML(filename string) error {
file, err := Также в библиотеке
Работа с CSV в C++: библиотека libcsv и стандартные средства
Создание CLI-приложений на TypeScript: обзор фреймворков и инструментов
ts-jest для TypeScript: полное руководство с примерами
Планировщик задач Java: Quartz Scheduler – полное руководство
Работа с XML в Kotlin: библиотеки и инструменты для парсинга и создания