go基础库之有效地解析大型XML文件

栏目: 编程语言 · XML · 发布时间: 6年前

内容简介:XML是一种非常常见的数据交换格式。Go库包含对以与JSON相同的方式解析XML文件的支持。通常,使用与XML方案对应的结构,并且在此帮助下,一次解析XML内容。问题是当XML文件太大而无法容纳到内存中时,需要以块的形式解析文件。本文将展示如何处理大型XML文件并解析所需信息。

XML是一种非常常见的数据交换格式。Go库包含对以与JSON相同的方式解析XML文件的支持。通常,使用与XML方案对应的结构,并且在此帮助下,一次解析XML内容。问题是当XML文件太大而无法容纳到内存中时,需要以块的形式解析文件。本文将展示如何处理大型XML文件并解析所需信息。

有效地解析大型XML文件

Golang 版本

1.12.1

前沿

XML是一种非常常见的数据交换格式。Go库包含对以与JSON相同的方式解析XML文件的支持。通常,使用与XML方案对应的结构,并且在此帮助下,一次解析XML内容。问题是当XML文件太大而无法容纳到内存中时,需要以块的形式解析文件。本文将展示如何处理大型XML文件并解析所需信息。

实现

创建文件 data.xml ,内容如下:

<?xml version="1.0"?>
       <catalog>
         <book id="bk101">
           <author>Gambardella, Matthew</author>
           <title>XML Developer's Guide</title>
           <genre>Computer</genre>
           <price>44.95</price>
           <publish_date>2000-10-01</publish_date>
           <description>An in-depth look at creating applications 
            with XML.</description>
         </book>
         <book id="bk112">
           <author>Galos, Mike</author>
           <title>Visual Studio 7: A Comprehensive Guide</title>
           <genre>Computer</genre>
           <price>49.95</price>
           <publish_date>2001-04-16</publish_date>
           <description>Microsoft Visual Studio 7 is explored
            in depth, looking at how Visual Basic, Visual C++, C#,
            and ASP+ are integrated into a comprehensive development
            environment.</description>
         </book>
       </catalog>

创建文件 xml.go ,代码如下:

package main

import (
	"encoding/xml"
	"fmt"
	"os"
)

type Book struct {
	Title  string `xml:"title"`
	Author string `xml:"author"`
}

func main() {

	f, err := os.Open("data.xml")
	if err != nil {
		panic(err)
	}
	defer f.Close()
	decoder := xml.NewDecoder(f)

	// 逐一阅读本书
	books := make([]Book, 0)
	for {
		tok, _ := decoder.Token()
		if tok == nil {
			break
		}
		switch tp := tok.(type) {
		case xml.StartElement:
			if tp.Name.Local == "book" {
				// 将元素解码为struct
				var b Book
				decoder.DecodeElement(&b, &tp)
				books = append(books, b)
			}
		}
	}
	fmt.Println(books)
}
$ go run xml.go
[{XML Developer's Guide Gambardella, Matthew} {Visual Studio 7: A Comprehensive Guide Galos, Mike}]

原理

使用 xml 包的 NewDecoder 函数,可以创建XML内容的 Decoder

通过在 Decoder 上调用 Token 方法,接收 xml.Tokenxml.Token 是保存令牌类型的接口。 可以根据类型定义代码的行为。 示例代码测试解析的 xml.StartElement 是否是 book 元素之一。 然后它将数据部分解析为 Book 结构。 这样, Decoder 中底层 Reader 中指针的位置被struct数据移位,并且解析可以继续。


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Realm of Racket

Realm of Racket

Matthias Felleisen、Conrad Barski M.D.、David Van Horn、Eight Students Northeastern University of / No Starch Press / 2013-6-25 / USD 39.95

Racket is the noble descendant of Lisp, a programming language renowned for its elegance and power. But while Racket retains the functional goodness of Lisp that makes programming purists drool, it wa......一起来看看 《Realm of Racket》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器