Хотя и не такой популярный как раньше, формат XML всё ещё используется многими людьми для передачи данных. В последнее время я много разрабатываю на Go, поэтому, думаю, будет отличной идеей рассмотреть такую задачу, как работа с XML в Go.
Мы увидим, как читать XML данные, преобразовывать их в структуру. А также рассмотрим как конвертировать JSON в XML.
Очень круто, что в Go для работы с JSON и XML не требуются сторонние пакеты — всё для этого уже есть в самом языке.
Для примера возьмём такой XML:
Наша цель — понять как нужно работать с массивом XML-нод и вложенными данными. Короче говоря, нужно научиться работать со сложными XML данными.
Создайте и откройте файл main.go, он будет содержать такой код:
package main
import (
"encoding/json"
"encoding/xml"
"fmt"
)
type Data struct {
XMLName xml.Name `xml:"data" json:"-"`
PersonList []Person `xml:"person" json:"people"`
}
type Person struct {
XMLName xml.Name `xml:"person" json:"-"`
Firstname string `xml:"firstname" json:"firstname"`
Lastname string `xml:"lastname" json:"lastname"`
Address *Address `xml:"address" json:"address,omitempty"`
}
type Address struct {
City string `xml:"city" json:"city,omitempty"`
State string `xml:"state" json:"state,omitempty"`
}
func main() {
rawXmlData := "
var data Data
xml.Unmarshal([]byte(rawXmlData), &data)
jsonData, _ := json.Marshal(data)
fmt.Println(string(jsonData))
}
Здесь мы создали три структуры для представления каждого слоя данных XML.
Корневая нода будет представлена структурой Data. В ней вложены несколько
Обратите внимание на аннотации у полей структур. Эти аннотации задают привязки тегов XML к полям структуры и также к полям JSON. Аннотации с дефисом игнорируются.
При запуске приложения будет прочитан переданный XML, обработан и выведен в JSON:
{
"people": [
{
"firstname": "Nic",
"lastname": "Raboy",
"address": {
"city": "San Francisco",
"state": "CA"
}
},
{
"firstname": "Maria",
"lastname": "Raboy"
}
]
}
Очень удобно, что с этим кодом мы можем также сделать обратное преобразование, т.е. передав JSON, получить соответствующий XML.
Немного доработаем функцию main в файле main.go:
func main() {
rawJsonData := "{\"people\": [{\"firstname\": \"Nic\", \"lastname\": \"Raboy\"}]}"
var data Data
json.Unmarshal([]byte(rawJsonData), &data)
xmlData, _ := xml.Marshal(data)
fmt.Println(string(xmlData))
}
Готово!
Источник: Parse XML Data In A Golang Application
Разработчик: java, kotlin, c#, javascript, dart, 1C, python, php.
Пишите: @ighar. Buy me a coffee, please :).
а что лучше про производительности обработки больших XML (300Mb)
go или XMLReader?