更好用的轻量级 Go 语言 XML 库

etree 包是一个轻量级的、纯 Go 包,以元素树的形式表达 XML,项目的设计灵感来源于 Python 语言的 ElementTree 库,可以在无需定义结构体的情况下灵活的读取、生成 XML 文档。更好用的轻量级 Go 语言 XML 库

功能和特性

  • 将 XML 文档表示为元素树以便于遍历。
  • 从头开始导入、序列化、修改或创建 XML 文档。
  • 在文件、字节片、字符串和 io 接口中写入和读取 XML。
  • 使用类似 XPath 的轻量级查询 API 执行简单或复杂的搜索。
  • 使用空格或制表符自动缩进 XML 以提高可读性。
  • 用纯 Go 实现;仅依赖于标准 go 库。
  • 构建在 gocoding/xml 包之上。

创建 XML 文档

以下示例使用 etree 包从头开始创建 XML 文档,并将其缩进内容输出到 stdout。

doc := etree.NewDocument()
doc.CreateProcInst("xml", `version="1.0" encoding="UTF-8"`)
doc.CreateProcInst("xml-stylesheet", `type="text/xsl" href="style.xsl"`)

people := doc.CreateElement("People")
people.CreateComment("These are all known people")

jon := people.CreateElement("Person")
jon.CreateAttr("name""Jon")

sally := people.CreateElement("Person")
sally.CreateAttr("name""Sally")

doc.Indent(2)
doc.WriteTo(os.Stdout)

输出:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="style.xsl"?>
<People>
  <!--These are all known people-->
  <Person name="Jon"/>
  <Person name="Sally"/>
</People>

读取 XML 文件

假设磁盘上有一个名为 的文件,bookstore.xml 其中包含以下数据:

<bookstore xmlns:p="urn:schemas-books-com:prices">

  <book category="COOKING">
    <title lang="en">Everyday Italian</title>
    <author>Giada De Laurentiis</author>
    <year>2005</year>
    <p:price>30.00</p:price>
  </book>

  <book category="CHILDREN">
    <title lang="en">Harry Potter</title>
    <author>J K. Rowling</author>
    <year>2005</year>
    <p:price>29.99</p:price>
  </book>

  <book category="WEB">
    <title lang="en">XQuery Kick Start</title>
    <author>James McGovern</author>
    <author>Per Bothner</author>
    <author>Kurt Cagle</author>
    <author>James Linn</author>
    <author>Vaidyanathan Nagarajan</author>
    <year>2003</year>
    <p:price>49.99</p:price>
  </book>

  <book category="WEB">
    <title lang="en">Learning XML</title>
    <author>Erik T. Ray</author>
    <year>2003</year>
    <p:price>39.95</p:price>
  </book>

</bookstore>

此代码将文件的内容读取到 etree 文档中。

doc := etree.NewDocument()
if err := doc.ReadFromFile("bookstore.xml"); err != nil {
    panic(err)
}

还可以从字符串、字节片或 io.Reader。

处理元素和属性

此示例说明了使用 etree 选择查询访问元素和属性的几种方法。

root := doc.SelectElement("bookstore")
fmt.Println("ROOT element:", root.Tag)

for _, book := range root.SelectElements("book") {
    fmt.Println("CHILD element:", book.Tag)
    if title := book.SelectElement("title"); title != nil {
        lang := title.SelectAttrValue("lang""unknown")
        fmt.Printf("  TITLE: %s (%s)n", title.Text(), lang)
    }
    for _, attr := range book.Attr {
        fmt.Printf("  ATTR: %s=%sn", attr.Key, attr.Value)
    }
}

输出:

ROOT element: bookstore
CHILD element: book
  TITLE: Everyday Italian (en)
  ATTR: category=COOKING
CHILD element: book
  TITLE: Harry Potter (en)
  ATTR: category=CHILDREN
CHILD element: book
  TITLE: XQuery Kick Start (en)
  ATTR: category=WEB
CHILD element: book
  TITLE: Learning XML (en)
  ATTR: category=WEB

路径查询

此示例使用 etree 的路径函数来选择属于“WEB”类别的所有书名。路径中的双斜杠前缀会导致递归地搜索 book 元素;book 元素可以出现在 XML 层次结构的任何级别。

for _, t := range doc.FindElements("//book[@category='WEB']/title") {
    fmt.Println("Title:", t.Text())
}

输出:

Title: XQuery Kick Start
Title: Learning XML

传送门

开源协议:BSD-2-Clause license

开源地址:https://github.com/beevik/etree

-END-


原文始发于微信公众号(开源技术专栏):更好用的轻量级 Go 语言 XML 库

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/166594.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!