XML 處理,Go 標準庫太簡單了怎麼辦?

閱讀本文大概需要 4 分鐘。

雖然官方有 xml 處理的庫,但比較簡單。今天介紹一個基於官方 xml 庫的增強庫:etree https://github.com/beevik/etree,它是一個輕量級的純 Go 包,它可以用於以元素樹的形式表示 XML 文檔。它的設計受到了 Python ElementTree 模塊的啓發。

etree 的特點

etree 的使用方法

doc := etree.NewDocument()
if err := doc.ReadFromFile("bookstore.xml"); err != nil {
  panic(err)
}
root := doc.SelectElement("bookstore")
book := root.CreateElement("book")
book.CreateAttr("category""WEB")
title := book.CreateElement("title")
title.SetText("Go in Action")
books := root.SelectElements("book")
for _, book := range books {
  title := book.SelectElement("title")
  fmt.Println(title.Text())
}
doc.Indent(2)
doc.WriteTo(os.Stdout)

etree 庫的具體案例

假設你有一個 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 main

import (
 "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 庫的缺點:

綜上所述,etree 庫是一個適合於 Go 開發者使用的輕量級和易用的 XML 處理庫,它可以滿足一些基本和常見的需求。

我是 polarisxu,北大碩士畢業,曾在 360 等知名互聯網公司工作,10 多年技術研發與架構經驗!2012 年接觸 Go 語言並創建了 Go 語言中文網!著有《Go 語言編程之旅》、開源圖書《Go 語言標準庫》等。

堅持輸出技術(包括 Go、Rust 等技術)、職場心得和創業感悟!歡迎關注「polarisxu」一起成長!也歡迎加我微信好友交流:gopherstudio

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/Neuc_hiVsVE83d47e40l6w