GoLang XML 解析神器 etree 转载自“北极熊博客”


本文摘自网络,作者whoiswho,侵删。

etree包是一个轻量级的纯go包,它以元素树的形式表示XML。它的设计灵感来自Python ElementTree模块。

Github 项目地址

https://github.com/beevik/etree DOC http://godoc.org/github.com/beevik/etree

安装方式 go get github.com/beevik/etree

创建一个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)

GoCopy

输出:

<?xml version="1.0" encoding="UTF-8"?>

<?xml-stylesheet type="text/xsl" href="style.xsl"?>

读取XML文件

假设磁盘上有一个bookstore.xml包含

以下数据的文件:

Everyday Italian Giada De Laurentiis 2005 30.00 Harry Potter J K. Rowling 2005 29.99 XQuery Kick Start James McGovern Per Bothner Kurt Cagle James Linn Vaidyanathan Nagarajan 2003 49.99 Learning XML Erik T. Ray 2003 39.95

XMLCopy

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

doc := etree.NewDocument()

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

panic(err)

}

GoCopy

您还可以从字符串,字节片或读取XML 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=%s\n", attr.Key, attr.Value)

}

}

GoCopy

输出:

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元素可以出现在

XML层次结构的任何级别。

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

fmt.Println("Title:", t.Text())

}

GoCopy

输出:

Title: XQuery Kick Start

Title: Learning XML

本示例在根bookstore元素下找到第一个book元素,并

输出其每个子元素的标签和文本。

for _, e := range doc.FindElements("./bookstore/book[1]/*") {

fmt.Printf("%s: %s\n", e.Tag, e.Text())

}

GoCopy

输出:

title: Everyday Italian

author: Giada De Laurentiis

year: 2005

price: 30.00

本示例查找价格为49.99的所有书籍并输出其书名。

path := etree.MustCompilePath("./bookstore/book[p:price='49.99']/title")

for _, e := range doc.FindElementsPath(path) {

fmt.Println(e.Text())

}

GoCopy

输出:

XQuery Kick Start

请注意,此示例使用FindElementsPath函数,该

函数将预编译的路径对象作为参数。当您计划

使用同一路径多次搜索时,请使用预编译路径。

其他特性

这些只是etree包可以做的事情的几个例子。有关 功能的完整说明,请参见

文档。

转载自“北极熊博客”


相关阅读 >>

手撸Golang Go与微服务 saga模式之9 小结/gitee源码

手撸Golang 创建型设计模式 建造者模式

Golang并发原语之-信号量semaphore

Go语言学习11-数据的使用

Golang 开发

Golang怎么判断slice是否为空

手撸Golang 基本数据结构与算法 快速排序

一个微服务 demo 将我三年 Go web 开发经验传授给你

手撸Golang Go与微服务 saga模式之6

Golang如何打包

更多相关阅读请进入《Go》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...