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 mainimport ("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())}}
![416e436c9bcaefdad54e9d5487bd859c.png](https://i-blog.csdnimg.cn/blog_migrate/060439a0c51f0042079e0d84c9c44d26.jpeg)
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").Valueage := v.SelectAttr("age").Valuegender := v.SelectAttr("gender").Valuefmt.Printf("%s: 性别为:%s, 年龄为: %s ", name, gender, age)}}
etree的功能非常强大,我们还可以通过RemoveAttr、RemoveChild等移除节点,节点属性。感兴趣的同学可以去pkg.go.dev查看官方的文档