G

GoLang XML 解析神器 etree

Bejix 代码笔记 2020-08-23

etree

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

The etree package is a lightweight, pure go package that expresses XML in the form of an element tree. Its design was inspired by the Python ElementTree module.

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)

输出:

<?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)
}

您还可以从字符串,字节片或读取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)
    }
}

输出:

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())
}

输出:

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())
}

输出:

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())
}

输出:

XQuery Kick Start

请注意,此示例使用FindElementsPath函数,该
函数将预编译的路径对象作为参数。当您计划
使用同一路径多次搜索时,请使用预编译路径。

其他特性

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

贡献

该项目接受捐款。只需分叉存储库并提交请求!


更详细用法见文档 https://godoc.org/github.com/beevik/etree
文章示例转载于 :https://blog.csdn.net/weixin_39172380/article/details/84944307

PREV
介绍一款Go项目热编译工具-gowatch
NEXT
CentOS 7 安装Golang 环境

评论(0)

发布评论