阅读本文大概需要 4 分钟。
虽然官方有 xml 处理的库,但比较简单。今天介绍一个基于官方 xml 库的增强库:etree https://github.com/beevik/etree,它是一个轻量级的纯 Go 包,它可以用于以元素树的形式表示 XML 文档。它的设计受到了 Python ElementTree 模块的启发。
etree.NewDocument
函数来创建一个新的 XML 文档,或者用 etree.Read*
系列函数来从不同的源读取 XML 文档,例如:doc := etree.NewDocument()
if err := doc.ReadFromFile("bookstore.xml"); err != nil {
panic(err)
}
etree.Element
结构体来表示 XML 文档中的元素,它有一些方法来创建、获取或修改元素的属性、子元素、文本内容等,例如:root := doc.SelectElement("bookstore")
book := root.CreateElement("book")
book.CreateAttr("category", "WEB")
title := book.CreateElement("title")
title.SetText("Go in Action")
etree.Path
函数来根据类似 XPath 的路径表达式来查找元素,例如:books := root.SelectElements("book")
for _, book := range books {
title := book.SelectElement("title")
fmt.Println(title.Text())
}
etree.Write*
系列函数来将 XML 文档写入不同的目标,例如:doc.Indent(2)
doc.WriteTo(os.Stdout)
假设你有一个 XML 文件,叫做 students.xml
,它的内容是这样的:
<students>
<student id="1">
<name>Tom</name>
<age>18</age>
<score>90</score>
</student>
<student id="2">
<name>Alice</name>
<age>19</age>
<score>95</score>
</student>
<student id="3">
<name>Bob</name>
<age>20</age>
<score>85</score>
</student>
</students>
你想用 etree 来读取这个文件,并对其中的元素进行一些操作,例如:
你可以用以下的 Go 代码来实现这些操作:
package mainimport (
"fmt"
"github.com/beevik/etree"
)
func main() {
// 创建一个新的 XML 文档对象
doc := etree.NewDocument()
// 从文件中读取 XML 文档内容
if err := doc.ReadFromFile("students.xml"); err != nil {
panic(err)
}
// 获取根元素 students
root := doc.SelectElement("students")
// 遍历根元素的所有子元素 student
for _, student := range root.SelectElements("student") {
// 获取 student 元素的 id 属性值
id := student.SelectAttrValue("id", "unknown")
// 获取 student 元素的 name 子元素的文本内容
name := student.SelectElement("name").Text()
// 获取 student 元素的 score 子元素的文本内容
score := student.SelectElement("score").Text()
// 打印出 id, name 和 score
fmt.Printf("Student %s: %s, %s\n", id, name, score)
}
// 修改第二个 student 元素的 score 子元素的文本内容为 100
root.SelectElement("student[2]").SelectElement("score").SetText("100")
// 删除第三个 student 元素
root.RemoveChild(root.SelectElement("student[3]"))
// 添加一个新的 student 元素
newStudent := root.CreateElement("student")
newStudent.CreateAttr("id", "4")
newStudent.CreateElement("name").SetText("Cathy")
newStudent.CreateElement("age").SetText("21")
newStudent.CreateElement("score").SetText("88")
// 将修改后的 XML 文档保存到一个新的文件中
doc.Indent(2)
doc.WriteToFile("new_students.xml")
}
运行这段代码后,你会看到以下的输出:
Student 1: Tom, 90
Student 2: Alice, 95
Student 3: Bob, 85
并且,你会在当前目录下生成一个新的文件 new_students.xml
,它的内容是这样的:
<students>
<student id="1">
<name>Tom</name>
<age>18</age>
<score>90</score>
</student>
<student id="2">
<name>Alice</name>
<age>19</age>
<score>100</score>
</student>
<student id="4">
<name>Cathy</name>
<age>21</age>
<score>88</score>
</student>
</students>
etree 库的优点:
etree 库的缺点:
综上所述,etree 库是一个适合于 Go 开发者使用的轻量级和易用的 XML 处理库,它可以满足一些基本和常见的需求。
我是 polarisxu,北大硕士毕业,曾在 360 等知名互联网公司工作,10多年技术研发与架构经验!2012 年接触 Go 语言并创建了 Go 语言中文网!著有《Go语言编程之旅》、开源图书《Go语言标准库》等。
坚持输出技术(包括 Go、Rust 等技术)、职场心得和创业感悟!欢迎关注「polarisxu」一起成长!也欢迎加我微信好友交流:gopherstudio