使用go語言解析xml


操作系統: CentOS 6.9_x64

go語言版本: 1.8.3

問題描述

現有一個自動報障程序,如果服務出錯會自動給指定人發送郵件,配置文件內容如下(default.xml):

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <smtpServer>smtp.163.com</smtpServer>
    <smtpPort>25</smtpPort>
    <sender>user@163.com</sender>
    <senderPasswd>123456</senderPasswd>
    <receivers flag="true">
        <user>Mike_Zhang@live.com</user>
        <user>test1@qq.com</user>
    </receivers>
</config>

該配置以config為root標簽,有xml text部分(比如smtpServer標簽)、嵌套xml(receivers標簽)、有xml attribute部分(receivers標簽的flag)、類似數組的多行配置(user標簽), 數據類型有字符串和數字兩種類型。

解決方案

package main

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

type SConfig struct {
    XMLName    xml.Name `xml:"config"`  // 指定最外層的標簽為config
    SmtpServer string  `xml:"smtpServer"` // 讀取smtpServer配置項,並將結果保存到SmtpServer變量中
    SmtpPort int `xml:"smtpPort"`
    Sender string `xml:"sender"`
    SenderPasswd string `xml:"senderPasswd"`
    Receivers SReceivers `xml:"receivers"`  // 讀取receivers標簽下的內容,以結構方式獲取
}

type SReceivers struct {
    Flag string `xml:"flag,attr"` // 讀取flag屬性
    User []string `xml:"user"`  // 讀取user數組
}

func main() {
    file, err := os.Open("default.xml") // For read access.
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    defer file.Close()
    data, err := ioutil.ReadAll(file)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }
    v := SConfig{}
    err = xml.Unmarshal(data, &v)
    if err != nil {
        fmt.Printf("error: %v", err)
        return
    }

    fmt.Println(v)
    fmt.Println("SmtpServer : ",v.SmtpServer)
    fmt.Println("SmtpPort : ",v.SmtpPort)
    fmt.Println("Sender : ",v.Sender)
    fmt.Println("SenderPasswd : ",v.SenderPasswd)
    fmt.Println("Receivers.Flag : ",v.Receivers.Flag)
    for i,element := range v.Receivers.User {
        fmt.Println(i,element)
    }
}

運行效果:

[root@local t1]# ls
default.xml  xmlCnfTest1.go
[root@local t1]# go run xmlCnfTest1.go
{{ config} smtp.163.com 25 user@163.com 123456 {true [Mike_Zhang@live.com test1@qq.com]}}
SmtpServer :  smtp.163.com
SmtpPort :  25
Sender :  user@163.com
SenderPasswd :  123456
Receivers.Flag :  true
0 Mike_Zhang@live.com
1 test1@qq.com
[root@local t1]#

討論

如果需要直接從字符串解析xml配置,可將如下語句中的data替換即可:

err = xml.Unmarshal(data, &v)

比如:

err = xml.Unmarshal([]byte(ConfigContent), &v) // ConfigContent為xml字符串

好,就這些了,希望對你有幫助。

本文github地址:

https://github.com/mike-zhang/mikeBlogEssays/blob/master/2017/20170610_使用go解析xml.rst

歡迎補充 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM