Функция xml.NewEncoder
Функция xml.NewEncoder создает новый экземпляр кодировщика,
который записывает XML-представление Go-значений в указанный
выходной поток. В качестве параметра функция принимает объект,
реализующий интерфейс io.Writer - это может быть, например,
os.Stdout, bytes.Buffer или файл. Функция возвращает
указатель на структуру Encoder, через которую можно кодировать
данные с помощью метода Encode.
Синтаксис
func NewEncoder(w io.Writer) *Encoder
Пример
Давайте создадим кодировщик для вывода XML в стандартный вывод и закодируем простую структуру:
package main
import (
"encoding/xml"
"fmt"
"os"
)
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
}
func main() {
p := Person{Name: "John", Age: 30}
encoder := xml.NewEncoder(os.Stdout)
encoder.Indent("", " ")
err := encoder.Encode(p)
if err != nil {
fmt.Println("Error:", err)
}
}
Результат выполнения кода:
<person>
<name>John</name>
<age>30</age>
</person>
Пример
Кодировщик можно использовать для записи XML в буфер и последующего получения строки:
package main
import (
"bytes"
"encoding/xml"
"fmt"
)
type Book struct {
XMLName xml.Name `xml:"book"`
Title string `xml:"title"`
Author string `xml:"author"`
}
func main() {
b := Book{Title: "Go Programming", Author: "John Doe"}
buf := new(bytes.Buffer)
encoder := xml.NewEncoder(buf)
encoder.Indent("", " ")
err := encoder.Encode(b)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Printf("%s", buf.String())
}
Результат выполнения кода:
<book>
<title>Go Programming</title>
<author>John Doe</author>
</book>
Пример
Кодировщик поддерживает сериализацию срезов и массивов, создавая множество элементов в XML:
package main
import (
"bytes"
"encoding/xml"
"fmt"
)
type Library struct {
XMLName xml.Name `xml:"library"`
Books []Book `xml:"book"`
}
type Book struct {
Title string `xml:"title"`
Year int `xml:"year"`
}
func main() {
lib := Library{
Books: []Book{
{Title: "Book One", Year: 2020},
{Title: "Book Two", Year: 2021},
},
}
buf := new(bytes.Buffer)
encoder := xml.NewEncoder(buf)
encoder.Indent("", " ")
err := encoder.Encode(lib)
if err != nil {
fmt.Println("Error:", err)
}
fmt.Printf("%s", buf.String())
}
Результат выполнения кода:
<library>
<book>
<title>Book One</title>
<year>2020</year>
</book>
<book>
<title>Book Two</title>
<year>2021</year>
</book>
</library>
Смотрите также
-
функцию
xml.Marshal,
которая преобразует Go-значение в XML-строку без записи в поток -
функцию
xml.Unmarshal,
которая парсит XML-данные в Go-структуру -
метод
encoder.Encode,
который выполняет кодирование Go-значения в XML -
функцию
xml.NewDecoder,
которая создает декодер для чтения XML из потока