Функция xml.Unmarshal

Функция xml.Unmarshal преобразует XML-данные в структуры Go. Первый параметр принимает срез байтов с XML-данными, второй - указатель на структуру, в которую нужно распарсить данные. Функция возвращает ошибку, если парсинг не удался.

Синтаксис

goerr := xml.Unmarshal(data, &struct)

Пример

Давайте распарсим простой XML с тегом person, содержащим атрибуты и вложенные элементы:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Person struct {
  XMLName xml.Name `xml:"person"`
  ID    int    `xml:"id,attr"`
  Name  string   `xml:"name"`
  Age   int    `xml:"age"`
}

func main() {
  data := []byte(`
    <person id="123">
      <name>John Doe</name>
      <age>30</age>
    </person>
  `)

  var res Person
  err := xml.Unmarshal(data, &res)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Printf("ID: %d, Name: %s, Age: %d\n", res.ID, res.Name, res.Age)
}

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

go"ID: 123, Name: John Doe, Age: 30"

Пример

Распарсим XML со списком элементов, используя тег xml:"item" для маркировки:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Item struct {
  XMLName xml.Name `xml:"item"`
  Name  string   `xml:"name"`
  Price   float64  `xml:"price"`
}

type Catalog struct {
  XMLName xml.Name `xml:"catalog"`
  Items   []Item   `xml:"item"`
}

func main() {
  data := []byte(`
    <catalog>
      <item>
        <name>Laptop</name>
        <price>999.99</price>
      </item>
      <item>
        <name>Mouse</name>
        <price>25.50</price>
      </item>
    </catalog>
  `)

  var res Catalog
  err := xml.Unmarshal(data, &res)
  if err != nil {
    fmt.Println(err)
    return
  }

  for _, item := range res.Items {
    fmt.Printf("%s: $%.2f\n", item.Name, item.Price)
  }
}

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

go"Laptop: $999.99"
"Mouse: $25.50"

Пример

Обработаем XML с пространствами имен, используя поле XMLName:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Doc struct {
  XMLName xml.Name `xml:"http://example.com doc"`
  Body  string   `xml:"body"`
}

func main() {
  data := []byte(`
    <doc xmlns="http://example.com">
      <body>Hello, XML namespace!</body>
    </doc>
  `)

  var res Doc
  err := xml.Unmarshal(data, &res)
  if err != nil {
    fmt.Println(err)
    return
  }

  fmt.Println(res.Body)
}

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

go"Hello, XML namespace!"

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

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