Golang - 解组额外的XML属性

时间:2014-08-27 15:09:25

标签: go

有没有办法用动态属性解组XML标签(我不知道每次都会得到哪些属性)。

也许它还没有得到支持。见Issue 3633: encoding/xml: support for collecting all attributes

类似的东西:

package main

import (
    "encoding/xml"
    "fmt"
)

func main() {
    var v struct {
        Attributes []xml.Attr `xml:",any"`
    }

    data := `<TAG ATTR1="VALUE1" ATTR2="VALUE2" />`

    err := xml.Unmarshal([]byte(data), &v)
    if err != nil {
        panic(err)
    }
    fmt.Println(v)
}

2 个答案:

答案 0 :(得分:3)

您需要实施自己的XMLUnmarshaler

package main

import (
    "encoding/xml"
    "fmt"
)

type CustomTag struct {
    Name       string
    Attributes []xml.Attr
}

func (c *CustomTag) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    c.Name = start.Name.Local
    c.Attributes = start.Attr
    return d.Skip()
}

func main() {
    v := &CustomTag{}

    data := []byte(`<tag ATTR1="VALUE1" ATTR2="VALUE2" />`)

    err := xml.Unmarshal(data, &v)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%+v\n", v)
}

输出

&{Name:tag Attributes:[{Name:{Space: Local:ATTR1} Value:VALUE1} {Name:{Space: Local:ATTR2} Value:VALUE2}]}

http://play.golang.org/p/9ZrpIT32o_

答案 1 :(得分:2)

截至2017年底,使用以下方式支持:

var v struct {
    Attributes []xml.Attr `xml:",any,attr"`
}

请参阅Preloading fonts in Chrome with 'preload' link directive