Тип xml.Attr

Тип xml.Attr представляет собой структуру, описывающую один атрибут XML-элемента. Он содержит два поля: Name (тип xml.Name) - имя атрибута с его пространством имен, и Value (тип string) - значение атрибута. Этот тип используется при ручном разборе XML-документов с помощью xml.Decoder, а также в структурах, предназначенных для маршалинга и анмаршалинга.

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

gotype Attr struct {
  Name  Name
  Value string
}

Поле Name содержит локальное имя атрибута и его пространство имен, а поле Value хранит строковое значение атрибута.

Пример

Давайте создадим экземпляр xml.Attr и выведем его поля:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

func main() {
  attr := xml.Attr{
    Name: xml.Name{
      Local: "id",
    },
    Value: "12345",
  }

  fmt.Println(attr.Name.Local)
  fmt.Println(attr.Value)
}

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

go"id"
"12345"

Пример

Атрибуты могут иметь пространство имен. Давайте создадим атрибут с полным именем:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

func main() {
  attr := xml.Attr{
    Name: xml.Name{
      Space: "http://example.com/ns",
      Local: "version",
    },
    Value: "1.0",
  }

  fmt.Println(attr.Name.Space)
  fmt.Println(attr.Name.Local)
  fmt.Println(attr.Value)
}

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

go"http://example.com/ns"
"version"
"1.0"

Пример

Тип xml.Attr часто используется при работе с xml.StartElement. Получим атрибуты из XML-элемента:

gopackage main

import (
  "encoding/xml"
  "fmt"
  "strings"
)

func main() {
  xmlData := `<book id="123" lang="en">Go Programming</book>`
  decoder := xml.NewDecoder(strings.NewReader(xmlData))

  for {
    token, err := decoder.Token()
    if err != nil {
      break
    }

    switch element := token.(type) {
    case xml.StartElement:
      for _, attr := range element.Attr {
        fmt.Printf("%s: %s\n", attr.Name.Local, attr.Value)
      }
    }
  }
}

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

go"id: 123"
"lang: en"

Пример

При маршалинге структур в XML можно использовать теги для указания атрибутов. Но тип xml.Attr также может быть использован для динамической работы с атрибутами:

gopackage main

import (
  "encoding/xml"
  "fmt"
)

func main() {
  attrs := []xml.Attr{
    {Name: xml.Name{Local: "id"}, Value: "user-001"},
    {Name: xml.Name{Local: "active"}, Value: "true"},
  }

  start := xml.StartElement{
    Name: xml.Name{Local: "user"},
    Attr: attrs,
  }

  fmt.Println(start.Name.Local)
  for _, attr := range start.Attr {
    fmt.Printf("%s=%s ", attr.Name.Local, attr.Value)
  }
}

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

go"user"
"id=user-001 active=true "

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

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