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

whoiswho · · 1240 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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"?> <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> 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包可以做的事情的几个例子。有关 功能的完整说明,请参见 文档。 转载自“北极熊博客”

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1240 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传