golang如何解析xml数据?相信大家的第一反应就是使用标准包encoding/xml,但是这往往需要我们提前定义好一个结构体,然后通过xml.Unmarshal将数据写入到对应的结构体。一旦xml定义起来将非常难受,今天小编给大家推荐一个超好用的xml的第三方类库可直接从xml字符串或者xml文件中读取相应的节点。
一、安装(go module)
go get github.com/beevik/etree
版本:
- v1.1.0 – Feb 2, 2019
- v1.0.1 – May 6, 2018
- v1.0.0 – Aug 9, 2017
二、特性
- 将XML文档表示为元素树,以便于遍历。
- 从顶级节点开始,导入,序列化,修改或创建XML文档。
- 向文件,字节切片,字符串和io接口读写XML。
- 使用类似XPath的轻量级查询API方式,执行简单或复杂的搜索
- 使用空格或制表符自动缩进XML,以提高可读性。
- 建立在go标准包encoding / xml基础之上
三、基本使用
1.写入xml文件
package main
import (
"fmt"
"github.com/beevik/etree"
)
func main() {
doc := etree.NewDocument()
doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`)
doc.CreateProcInst("xml-stylesheet", `type="text/xsl" href="style.xsl"`)
// 设置节点
students := doc.CreateElement("Students")
tom := students.CreateElement("Student")
tom.CreateAttr("name", "tom")
tom.CreateAttr("age", "20")
tom.CreateAttr("gender", "male")
lucy := students.CreateElement("Student")
lucy.CreateAttr("name", "lucy")
lucy.CreateAttr("age", "18")
lucy.CreateAttr("gender", "female")
// 设置缩进
doc.Indent(4)
if err := doc.WriteToFile("./students.xml"); err != nil {
fmt.Println("写入失败, reason:" + err.Error())
}
}

2.从文件读取
我就直接读取刚刚生成的studnet.xml
doc := etree.NewDocument()
if err := doc.ReadFromFile("./students.xml"); err != nil {
fmt.Println("读取失败, reason:" + err.Error())
}
// 读取Students下面的所有子节点
students := doc.SelectElement("Students").ChildElements()
if len(students) > 0 {
for _, v := range students {
// 获取xml中节点的name属性值
name := v.SelectAttr("name").Value
age := v.SelectAttr("age").Value
gender := v.SelectAttr("gender").Value
fmt.Printf("%s: 性别为:%s, 年龄为: %s \n", name, gender, age)
}
}
etree的功能非常强大,我们还可以通过RemoveAttr、RemoveChild等移除节点,节点属性。感兴趣的同学可以去pkg.go.dev查看官方的文档