Как демаршалировать Go xml?

У меня есть XML-данные, которые нужно разложить на фрагменты строк ["13.64.196.27/32", "13.64.198.19/32"], но я получаю ошибку "undefined: Product" в самом начале всего этого. У меня определена структура продукта ... не знаю, чего она от меня хочет. См. Ниже и play.golang.org/p/Ak6bx3BLwq

func main() {
    data := `<products updated="9/1/2017">
<product name="o365">
<addresslist type="IPv4">
<address>13.64.196.27/32</address>
<address>13.64.198.19/32</address>
</addresslist>
</product>
</products>`

    type Azure struct {
        XMLName  xml.Name  `xml:"products"`
        Products []Product `xml:"product"`
    }

    type Product struct {
        XMLName xml.Name `xml:"product"`
        Name    string   `xml:"name,attr"`
        List    []List   `xml:"addresslist"`
    }

    type List struct {
        XMLName xml.Name `xml:"addresslist"`
        Type    string   `xml:"type,attr"`
        Address []string `xml:"addressList>address"`
    }

    var products Azure
    xml.Unmarshal([]byte(data), &products)
    fmt.PrintLn(products.List.Address)
}

person irom    schedule 07.09.2017    source источник


Ответы (1)


Во-первых, вы должны определить переменные вне реализаций функций, а во-вторых, вы пытаетесь использовать fmt.PrintLn, которого не существует.

Я немного поправил, надеюсь, это поможет:

package main

import (
    "fmt"
    "encoding/xml"
)

type Azure struct {
    XMLName  xml.Name  `xml:"products"`
    Products []Product `xml:"product"`
}

type Product struct {
    XMLName xml.Name `xml:"product"`
    Name    string   `xml:"name,attr"`
    List    []List   `xml:"addresslist"`
}

type List struct {
    XMLName xml.Name `xml:"addresslist"`
    Type    string   `xml:"type,attr"`
    Address []string `xml:"addressList>address"`
}

func main() {
    data := `<products updated="9/1/2017">
<product name="o365">
<addresslist type="IPv4">
<address>13.64.196.27/32</address>
<address>13.64.198.19/32</address>
</addresslist>
</product>
</products>`

    var products Azure
    xml.Unmarshal([]byte(data), &products)
    fmt.Println(products)
}
person Denniselite    schedule 07.09.2017
comment
Спасибо, знаете ли вы, почему он печатает пустой фрагмент {{products} [{{product} o365 [{{addresslist} IPv4 []}]}]}? Я ожидал 13.64.196.27/32, 13.64.198.19/32 внутри - person irom; 07.09.2017
comment
you should define variables out of function implementations - ›Определение именованных типов внутри функции допустимо, и иногда полезно, особенно для демаршалинга материала. ИМХО, поскольку иногда вам никогда не понадобятся эти типы где-либо еще в коде. - person Martin Tournoij; 07.09.2017
comment
@Carpetsmoker, это хорошая идея. Мне нужно делать это почаще. Часть моего кода заполнена частичными представлениями, возвращаемыми из SQL, которые не служат никакой цели, кроме как загромождать пакет. Тем не менее, убедитесь, что вы не пытаетесь использовать то же имя структуры в другом месте, иначе все станет действительно запутанным. - person RayfenWindspear; 07.09.2017
comment
@irom Это хороший способ узнать больше о GoLang и синтаксисе здесь ссылка - person Denniselite; 08.09.2017
comment
@Carpetsmoker, в данном случае у нас есть тип с вложенными структурами в коде функции. Для читаемого кода мы можем использовать общедоступные / частные структуры внутри пакета и, конечно, для простого демаршала JSON мы можем использовать его, но нам нужно позаботиться о сложности поддержки следующего кода. - person Denniselite; 08.09.2017
comment
После изменения из addressList ›адреса на просто адрес все в порядке ... - person irom; 08.09.2017