etree 包是一个轻量级的、纯 Go 包,以元素树的形式表达 XML,项目的设计灵感来源于 Python 语言的 ElementTree 库,可以在无需定义结构体的情况下灵活的读取、生成 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