Xml Unmarshal

1. 这都不会?不是有手就行?

今日报哥给我了一个问题:xml解析用go做过吗?

害羞

当时我的反应是:这都不会?

震惊

然后就开始了我的装逼(被打脸)之旅

2. 让我们来康康,发生甚么事了

首先,大家都知道,go语言在官方sdk对于json和xml都有基础支持
就是 encoding/xml encoding/json 包 我们惯性思维 解析xml嘛,跟json一样,一个结构体甩你脸上 直接Unmarshal就好

想象中

    xmlStr := "管他娘的什么xml"
    m := XmlItems{} //对着结构写的结构体
    xml.Unmarshal([]byte(str), &m)

然而,快乐的时光总是短暂的,我报哥直接甩给了我一个xml

    <?xml version="1.0" encoding="utf-8"?>
    <items>
        <item autocomplete="adfadfaaf" valid="yes">
            <title>adfaddffd</title>
            <subtitle>aaa</subtitle>
            <icon>is.png</icon>
            <text type="copy">dadafda</text>
        </item>
    </items>

天真的我还在想这个结构体怎么对着撸的时候,发现了几个问题

3. 这个光有手,还真不行

然而在残酷的现实中,无论我如何定义我的结构体,使用xml的tag 总有一部分解析不出来,所以不得不求助谷歌大大并发现了几个有意思的东西

    xml.Name //作用域
    xml.Attr //可以直接解析属性
    `xml,xxxx` //根据不同情况附加各种写法
    type XmlItems struct {
        XMLName xml.Name `xml:"items"`
        Iterm []struct {
            XMLName      xml.Name `xml:"item"`
            Autocomplete xml.Attr `xml:"autocomplete,attr"`
            Valid        xml.Attr `xml:"valid,attr"`
            Title        string   `xml:"title"`
            Subtitle     string   `xml:"subtitle"`
            Icon         string   `xml:"icon"`
            Text         struct {
                XMLName      xml.Name `xml:"text"`
                TextType xml.Attr `xml:"type,attr"`
                Content  string   `xml:",innerxml"`
            } `xml:"text"`
        } `xml:"item"`
    }

4. 敌羞,吾去脱他衣

问题至此完全解决,我要拿着结果跟我报哥邀功去了

得瑟