golang解析xml

/ go / 没有评论 / 2306浏览

golang解析xml

解析xml标签或者html标签,都是xml文档格式。要是返回的html标签,可以用第三方依赖库goquery来解析。下面说下,解析xml标签的格式。直接上代码,代码如下:

package main

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


type SConfig struct {
    // 指定最外层的标签为config
    XMLName xml.Name `xml:"config"`
     // 读取smtpServer配置项,并将结果保存到SmtpServer变量中
    SmtpServer string `xml:"smtpServer"`
    SmtpPort int `xml:"smtpPort"`
    Sender string `xml:"sender"`
    SenderPasswd string `xml:"senderPasswd"`
    // 读取receivers标签下的内容,以结构方式获取
    Receivers SReceivers `xml:"receivers"`
}

type SReceivers struct {
     // 读取flag属性
    Flag string `xml:"flag,attr"`
    // 读取user数组
    User []string `xml:"user"` 
}

func main() {
    // For read access.
    file, err := os.Open("servers.xml") 
    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)
    }
}

举例:xml 格式如下:文件名,servers.xml

<config>
    <smtpServer>smtp.163.com</smtpServer>
    <smtpPort>25</smtpPort>
    <sender>user@163.com</sender>
    <senderPasswd>123456</senderPasswd>
    <receivers flag="true">
        <age>16</age>
        <user>Mike_Zhang@live.com</user>
        <user>test1@qq.com</user>
    </receivers>
</config>

在代码里,先针对xml的格式,创建对应的struct结构体

type SConfig struct{
 ...
}
然后,读取xml文件,读取data,再解析对应的标签。

执行结果如下:

C:\go\src\first>go run xml.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