Работа с XML в Go (Golang): стандартная библиотека encoding/xml

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Работа с 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" — комментарий XML
  • xml:"-" — игнорировать поле

Потоковый парсинг больших 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 :=                    

Рекомендаций