douzhu3367 2017-07-06 15:09
浏览 21
已采纳

将XML解组到Go中的嵌入式结构

I have a flat XML structure, which I want to unmarshall in to a struct which has one part embedded. Is this possible? What is the syntax, or what custom method can I write?

In this example, I tag the nested struct with a guess: xml:"", which is skipped over by "encoding/xml".

type FloatHolder struct {
    Value float32    `xml:"value"`
}


type pv struct {
    XMLName    xml.Name  `xml:"series"`
    Test1 FloatHolder `xml:""`   // does not populate :-(
    Test2 FloatHolder `xml:"nested"` // populates
}
func main() {
    contents := `<series>
                   <nested>
                     <value>1234</value>
                   </nested>
                   <value>1234</value>
                 </series>`

    m := &pv{}

    err := xml.Unmarshal([]byte(contents), &m)
    if err != nil {
        panic(err)
    }
    fmt.Printf("%f %f
", m.Test1.Value, m.Test2.Value)
}

Output: "0.000000 1234.000000"

Playground: https://play.golang.org/p/aEdDLFYqL5

Thanks!

展开全部

  • 写回答

1条回答 默认 最新

  • dongying3744 2017-07-06 15:57
    关注

    EDIT: After comment interaction.

    Yes you can. Let's say

    XML:

    <series>
        <value>123456</value>
    </series>
    

    Struct definition:

    type FloatHolder struct {
        Value float32 `xml:",chardata"`
    }
    
    type pv struct {
        XMLName xml.Name    `xml:"series"`
        Test2   FloatHolder `xml:"value"`
    }
    

    Go Playground link: https://play.golang.org/p/9sWQaw0HlS


    Actually it's not a nested field, as per your XML. It belongs to series element.

    Update your struct to following:

    type pv struct {
        XMLName xml.Name    `xml:"series"`
        Test1   float32     `xml:"value"`
        Test2   FloatHolder `xml:"nested"`
    }
    

    Go Playground Link: https://play.golang.org/p/-mWrUMJXxX

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
编辑
预览

报告相同问题?