user634175
user634175

Reputation:

Unmarshalling XML attributes into a named, nested struct

Unmarshalling attributes from the current XML element into an anonymous struct works:

package main

import (
    "encoding/xml"
    "fmt"
)

type Attrs struct {
    Attr1 int `xml:"attr1,attr"`
    Attr2 int `xml:"attr2,attr"`
}
type Element struct {
    Attrs
}

func main() {
    data := `<element attr1="1" attr2="2"></element>`
    v := Element{}
    err := xml.Unmarshal([]byte(data), &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    fmt.Printf("%#v\n", v)
}

This prints main.Element{Attrs:main.Attrs{Attr1:1, Attr2:2}} as expected.

If the anonymous struct member is given a name, v.Attr1 and v.Attr2 are not unmarshalled.

type Element struct {
    AttrGroup Attrs
}

What's the correct tag to use on the struct member in this case?

Edit: Playground version

Upvotes: 2

Views: 293

Answers (1)

Nick Craig-Wood
Nick Craig-Wood

Reputation: 54081

Why not just do this? I don't see what the named struct buys you other than complexity.

(Playground)

package main

import (
    "encoding/xml"
    "fmt"
)

type Element struct {
    Attr1 int `xml:"attr1,attr"`
    Attr2 int `xml:"attr2,attr"`
}

func main() {
    data := `<element attr1="1" attr2="2"></element>`
    v := Element{}
    err := xml.Unmarshal([]byte(data), &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    fmt.Printf("%#v\n", v)
}

Which prints

main.Element{Attr1:1, Attr2:2}

Upvotes: 1

Related Questions