清风徐来
Michael's Blog
Go解析XML文件

在本教程中,我们将介绍如何有效读取XML文件,使用Go的encoding / xml包解析xml,遍历多个嵌套的xml元素,然后将其打印到终端

Go解析XML文件

##XML示例文件

<?xml version="1.0" encoding="UTF-8"?>
<users>
  <user type="admin">
    <name>Elliot</name>
    <social>
      <facebook>https://facebook.com</facebook>
      <twitter>https://twitter.com</twitter>
      <youtube>https://youtube.com</youtube>
    </social>
  </user>
  <user type="reader">
    <name>Fraser</name>
    <social>
      <facebook>https://facebook.com</facebook>
      <twitter>https://twitter.com</twitter>
      <youtube>https://youtube.com</youtube>
    </social>
  </user>
</users>

##完成代码部分

package main

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

type Users struct {
    XMLName xml.Name `xml:"users"`
    Users   []User   `xml:"user"`
}

type User struct {
    XMLName xml.Name `xml:"user"`
    Type    string   `xml:"type,attr"`
    Name    string   `xml:"name"`
    Social  Social   `xml:"social"`
}

type Social struct {
    XMLName  xml.Name `xml:"social"`
    Facebook string   `xml:"facebook"`
    Twitter  string   `xml:"twitter"`
    Youtube  string   `xml:"youtube"`
}

func main() {
    xmlFile, err := os.Open("users.xml")
    if err != nil {
        fmt.Println(err)
    }

    fmt.Println("成功打开 users.xml")
    defer xmlFile.Close()

    // 读取 xmlFile 到 byte array.
    byteValue, _ := ioutil.ReadAll(xmlFile)

    // 初始化 Users array
    var users Users

    xml.Unmarshal(byteValue, &users)

    for i := 0; i < len(users.Users); i++ {
        fmt.Println("User Type: " + users.Users[i].Type)
        fmt.Println("User Name: " + users.Users[i].Name)
        fmt.Println("Facebook Url: " + users.Users[i].Social.Facebook)
    }
}

运行

$ go run main.go
成功打开 users.xml
User Type: admin
User Name: Elliot
Facebook Url: https://facebook.com
User Type: reader
User Name: Fraser
Facebook Url: https://facebook.com

最后修改于 2019-07-30