Работа с XML в приложениях Go

Разработка /
Разработка: Работа с XML в приложениях Go
Хотя и не такой популярный как раньше, формат XML всё ещё используется многими людьми для передачи данных. В последнее время я много разрабатываю на Go, поэтому, думаю, будет отличной идеей рассмотреть такую задачу, как работа с XML в Go.

Мы увидим, как читать XML данные, преобразовывать их в структуру. А также рассмотрим как конвертировать JSON в XML.

Очень круто, что в Go для работы с JSON и XML не требуются сторонние пакеты — всё для этого уже есть в самом языке.

Для примера возьмём такой XML:

<data>
    <person>
        <firstname>Nic</firstname>
        <lastname>Raboy</lastname>
        <address>
            <city>San Francisco</city>
            <state>CA</state>
        </address>
    </person>
    <person>
        <firstname>Maria</firstname>
        <lastname>Raboy</lastname>
    </person>
</data>

Наша цель — понять как нужно работать с массивом 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 := "<data><person><firstname>Nic</firstname><lastname>Raboy</lastname><address><city>San Francisco</city><state>CA</state></address></person><person><firstname>Maria</firstname><lastname>Raboy</lastname></person></data>"
    var data Data
    xml.Unmarshal([]byte(rawXmlData), &data)
    jsonData, _ := json.Marshal(data)
    fmt.Println(string(jsonData))
}

Здесь мы создали три структуры для представления каждого слоя данных XML.

Корневая нода будет представлена структурой Data. В ней вложены несколько , которые будут представлены структурой Person. Также в ноде есть адрес, который будет представлен структурой Address.

Обратите внимание на аннотации у полей структур. Эти аннотации задают привязки тегов 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
0 комментариев
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.