Тип xml.Name

Тип xml.Name используется для представления имени XML-элемента или атрибута. Он содержит два поля: Space - пространство имен (URI) и Local - локальное имя без префикса. Этот тип часто применяется в структурах для управления маршалингом и анмаршалингом XML-данных. При обработке XML, xml.Name позволяет гибко работать с именами элементов, включая поддержку пространств имен.

Структура типа

gotype Name struct {
  Space string // пространство имен (URI)
  Local string // локальное имя
}

Поле Space может быть пустой строкой, если элемент не принадлежит пространству имен. Поле Local всегда содержит имя элемента.

Синтаксис

Объявление поля с типом xml.Name в структуре:

gotype MyStruct struct {
  XMLName xml.Name `xml:"elementName"`
  Value   string   `xml:"value"`
}

Для работы с именем элемента при маршалинге и анмаршалинге, тег xml определяет имя XML-элемента, соответствующего структуре.

Использование с анмаршалингом

Рассмотрим пример анмаршалинга XML-данных с использованием поля xml.Name:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Document struct {
  XMLName xml.Name
  Content string `xml:",chardata"`
}

func main() {
  data := []byte(`<book>Go Programming</book>`)
  var doc Document
  err := xml.Unmarshal(data, &doc)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Printf("Local: %s, Content: %s\n", doc.XMLName.Local, doc.Content)
}

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

go"Local: book, Content: Go Programming"

Использование пространств имен

При работе с XML-документами, использующими пространства имен, поле Space заполняется автоматически:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

type Root struct {
  XMLName xml.Name
  Value   string `xml:",chardata"`
}

func main() {
  data := []byte(`<ns:root xmlns:ns="http://example.com/ns">Hello</ns:root>`)
  var r Root
  err := xml.Unmarshal(data, &r)
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Printf("Space: %s, Local: %s, Value: %s\n", r.XMLName.Space, r.XMLName.Local, r.Value)
}

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

go"Space: http://example.com/ns, Local: root, Value: Hello"

Явное задание имени элемента

При маршалинге структуры, имя элемента может быть задано явно с помощью тега, или будет использовано имя структуры по умолчанию:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

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

func main() {
  p := Person{Name: "John", Age: 30}
  data, err := xml.MarshalIndent(p, "", "  ")
  if err != nil {
    fmt.Println("Error:", err)
    return
  }
  fmt.Println(string(data))
}

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

go"<person>
  <name>John</name>
  <age>30</age>
</person>"

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

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