Тип xml.Name
Тип xml.Name используется для представления имени XML-элемента или атрибута.
Он содержит два поля: Space - пространство имен (URI) и Local -
локальное имя без префикса. Этот тип часто применяется в структурах
для управления маршалингом и анмаршалингом XML-данных.
При обработке XML, xml.Name позволяет гибко работать с именами
элементов, включая поддержку пространств имен.
Структура типа
type Name struct {
Space string // пространство имен (URI)
Local string // локальное имя
}
Поле Space может быть пустой строкой, если элемент не принадлежит
пространству имен. Поле Local всегда содержит имя элемента.
Синтаксис
Объявление поля с типом xml.Name в структуре:
type MyStruct struct {
XMLName xml.Name `xml:"elementName"`
Value string `xml:"value"`
}
Для работы с именем элемента при маршалинге и анмаршалинге,
тег xml определяет имя XML-элемента, соответствующего структуре.
Использование с анмаршалингом
Рассмотрим пример анмаршалинга XML-данных с использованием поля xml.Name:
package 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)
}
Результат выполнения кода:
"Local: book, Content: Go Programming"
Использование пространств имен
При работе с XML-документами, использующими пространства имен,
поле Space заполняется автоматически:
package 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)
}
Результат выполнения кода:
"Space: http://example.com/ns, Local: root, Value: Hello"
Явное задание имени элемента
При маршалинге структуры, имя элемента может быть задано явно с помощью тега, или будет использовано имя структуры по умолчанию:
package 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))
}
Результат выполнения кода:
"<person>
<name>John</name>
<age>30</age>
</person>"
Смотрите также
-
тип
xml.StartElement,
который содержит начальный элемент XML с атрибутами -
тип
xml.Attr,
который представляет атрибут XML-элемента -
функцию
xml.Unmarshal,
которая преобразует XML-данные в структуру Go -
функцию
xml.Marshal,
которая преобразует структуру Go в XML-данные