2014-08-27 95 views
1

有沒有一種方法來解組動態屬性的XML標籤(我不知道每次我會得到哪些屬性)。Golang - 解組額外的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) 
} 

回答

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_