go語言xml處理

XML解析

設(shè)置要解析的對象

設(shè)置要解析的xml文件對象

type Result struct {
    XMLName xml.Name `xml:"persons"`//標(biāo)簽上的標(biāo)簽名
    Persons []Person `xml:"person"`
}
type Person struct {
    Name string `xml:"name,attr"`//persion標(biāo)簽屬性名為name的屬性值
    Age int `xml:"age,attr"`
    Career string `xml:"career"`//persion中標(biāo)簽名為career的值
    Interests []string `xml:"interests>interest"`//標(biāo)簽interests下的interest數(shù)組
    //不寫>當(dāng)子標(biāo)簽為一個的時候回把它當(dāng)做對象解析
}

對應(yīng)的xml文件
<?xml version="1.0" encoding="UTF-8"?>
<persons>
    <person name="polaris" age="28">
        <career>無業(yè)游民</career>
        <interests>
            <interest>編程</interest>
            <interest>下棋</interest>
        </interests>
    </person>
    <person name="studygolang" age="27">
        <career>碼農(nóng)</career>
        <interests>
            <interest>編程</interest>
            <interest>下棋</interest>
        </interests>
    </person>
</persons>

XML字符串讀取

方法一:轉(zhuǎn)對象
input := `<Person><FirstName>Xu</FirstName><LastName>Xinhua</LastName></Person>`
err := xml.Unmarshal([]byte(input), &v)//將文件轉(zhuǎn)化成對象
方法二:遍歷
package main

import (
    "encoding/xml"
    "strings"
    "fmt"
)

func main() {
    var t xml.Token
    var err error

    input := `<Person><FirstName>Xu</FirstName><LastName>Xinhua</LastName></Person>`
    inputReader := strings.NewReader(input)

    // 從文件讀取聚凹,如可以如下:
    // content, err := ioutil.ReadFile("studygolang.xml")
    // decoder := xml.NewDecoder(bytes.NewBuffer(content))

    decoder := xml.NewDecoder(inputReader)
    for t, err = decoder.Token(); err == nil; t, err = decoder.Token() {
        switch token := t.(type) {
        // 處理元素開始(標(biāo)簽)
        case xml.StartElement:
            name := token.Name.Local
            fmt.Printf("Token name: %s\n", name)
            for _, attr := range token.Attr {
                attrName := attr.Name.Local
                attrValue := attr.Value
                fmt.Printf("An attribute is: %s %s\n", attrName, attrValue)
            }
        // 處理元素結(jié)束(標(biāo)簽)
        case xml.EndElement:
            fmt.Printf("Token of '%s' end\n", token.Name.Local)
        // 處理字符數(shù)據(jù)(這里就是元素的文本)
        case xml.CharData:
            content := string([]byte(token))
            fmt.Printf("This is the content: %v\n", content)
        default:
            // ...
        }
    }
}

XML文件讀取

//從文件讀取睡榆,如可以如下:
content, err := ioutil.ReadFile("studygolang.xml")
decoder := xml.NewDecoder(bytes.NewBuffer(content))
xml.Unmarshal(content, &result)//將文件轉(zhuǎn)化成對象

生成xml

對象轉(zhuǎn)換為xml

package main

import (
    "encoding/xml"
    "fmt"
    // "os"
)

type Servers struct {
    XMLName xml.Name `xml:"servers"`
    Version string   `xml:"version,attr"`
    Svs     []server `xml:"server"`
}

type server struct {
    ServerName string `xml:"serverName"`
    ServerIP   string `xml:"serverIP"`
}

func main() {
    v := &Servers{Version: "1"}
    v.Svs = append(v.Svs, server{"Shanghai_VPN", "127.0.0.1"})
    v.Svs = append(v.Svs, server{"Beijing_VPN", "127.0.0.2"})
    output, err := xml.MarshalIndent(v, "  ", "    ")
    if err != nil {
        fmt.Printf("error: %v\n", err)
    }
    // os.Stdout.Write([]byte(xml.Header))

    // os.Stdout.Write(output)
    //將字節(jié)流轉(zhuǎn)換成string輸出
    fmt.Println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"+string(output))
}

map與XML相互轉(zhuǎn)換(只能解決簡單的的xml)

package main

import (
    "encoding/xml"
    "fmt"
    "io"
)

type Map map[string]string

type xmlMapEntry struct {
    XMLName xml.Name
    Value   string `xml:",chardata"`
}

// MarshalXML marshals the map to XML, with each key in the map being a
// tag and it's corresponding value being it's contents.
func (m Map) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    if len(m) == 0 {
        return nil
    }

    err := e.EncodeToken(start)
    if err != nil {
        return err
    }

    for k, v := range m {
        e.Encode(xmlMapEntry{XMLName: xml.Name{Local: k}, Value: v})
    }

    return e.EncodeToken(start.End())
}

// UnmarshalXML unmarshals the XML into a map of string to strings,
// creating a key in the map for each tag and setting it's value to the
// tags contents.
//
// The fact this function is on the pointer of Map is important, so that
// if m is nil it can be initialized, which is often the case if m is
// nested in another xml structurel. This is also why the first thing done
// on the first line is initialize it.
func (m *Map) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    *m = Map{}
    for {
        var e xmlMapEntry

        err := d.Decode(&e)
        if err == io.EOF {
            break
        } else if err != nil {
            return err
        }

        (*m)[e.XMLName.Local] = e.Value
    }
    return nil
}

func main() {
    // The Map
    m := map[string]string{
        "key_1": "Value One",
        "key_2": "Value Two",
    }
    fmt.Println(m)

    // Encode to XML
    x, _ := xml.MarshalIndent(Map(m), "", "  ")
    fmt.Println(string(x))

    // Decode back from XML
    var rm map[string]string
    xml.Unmarshal(x, (*Map)(&rm))
    fmt.Println(rm)
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末长已,一起剝皮案震驚了整個濱河市呐馆,隨后出現(xiàn)的幾起案子堵泽,更是在濱河造成了極大的恐慌稻励,老刑警劉巖败晴,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件未桥,死亡現(xiàn)場離奇詭異,居然都是意外死亡互妓,警方通過查閱死者的電腦和手機溪窒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來冯勉,“玉大人澈蚌,你說我怎么就攤上這事∽普” “怎么了宛瞄?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長交胚。 經(jīng)常有香客問我份汗,道長,這世上最難降的妖魔是什么蝴簇? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任杯活,我火速辦了婚禮,結(jié)果婚禮上熬词,老公的妹妹穿的比我還像新娘旁钧。我一直安慰自己吸重,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布歪今。 她就那樣靜靜地躺著嚎幸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪寄猩。 梳的紋絲不亂的頭發(fā)上嫉晶,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音焦影,去河邊找鬼车遂。 笑死,一個胖子當(dāng)著我的面吹牛斯辰,可吹牛的內(nèi)容都是我干的舶担。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼彬呻,長吁一口氣:“原來是場噩夢啊……” “哼衣陶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闸氮,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤剪况,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后蒲跨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體译断,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年或悲,在試婚紗的時候發(fā)現(xiàn)自己被綠了孙咪。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡巡语,死狀恐怖翎蹈,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情男公,我是刑警寧澤荤堪,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站枢赔,受9級特大地震影響澄阳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜踏拜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一碎赢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧执隧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至屋摔,卻和暖如春烁设,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背钓试。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工装黑, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人弓熏。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓恋谭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親挽鞠。 傳聞我的和親對象是個殘疾皇子疚颊,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)信认,斷路器材义,智...
    卡卡羅2017閱讀 134,656評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法嫁赏,內(nèi)部類的語法其掂,繼承相關(guān)的語法,異常的語法潦蝇,線程的語...
    子非魚_t_閱讀 31,631評論 18 399
  • 寫在前面 早前對此片只了解一二护蝶,缺時間也沒多大興趣华烟。不久前在豆瓣上看武俠片排行榜,竟發(fā)現(xiàn)此片以8.1分名列第八持灰。而...
    霆鑫閱讀 8,402評論 0 2
  • 想要超越碎片化時間盔夜,有以下三種方法:1、抵御干擾堤魁,2喂链、投資時間,3妥泉、設(shè)定一個人生主題 在抵御干擾中椭微,又分為內(nèi)部干擾...
    有錢YQ閱讀 724評論 0 2
  • 女生之間的友誼,很奇怪盲链∮剩可以因為一個秘密迟杂,兩人就變得如膠似漆,也可以因為幾句話就老死不相往來本慕。 我是女...
    二莫文閱讀 614評論 2 3