6.基于 Go 的 encoding/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)
<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 来读取这个文件,并对其中的元素进行一些操作,例如:
.将修改后的 XML 文档保存到一个新的文件中
package main import ( "fmt" "github.com/beevik/etree" ) func main() { // 堆代码 duidaima.com // 创建一个新的 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 的优缺点
4.它不支持处理 XML 文档中的 CDATA 节或注释