Go入门很简单:读取本地XML文件

382 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

读取 XML 文件

先来看一看如何读取本地 XML 文件,同 JSON 数据类似,Go 同样需要一个结构体来接收 XML 的数据。

我们定义一个要读取的 test.xml XML 文件,比如,我们要存取的是员工信息:

<?xml version="1.0" encoding="UTF-8"?>
<Record>
  <Name>Yuzhou</Name>
  <SurName>1su</SurName>
  <Tel>
    <Mobile>true</Mobile>
    <Number>12345678</Number>
  </Tel>
  <Tel>
    <Mobile>true</Mobile>
    <Number>0755-12345</Number>
  </Tel>
</Record>

然后我们看到该 XML 有一条记录,所以我们需要两个结构体:RecordTelphone

type Record struct {
	Name    string
	Surname string
	Tel     []Telephone
}

type Telephone struct {
	Mobile bool
	Number string
}

然后定义一个 readFromXML() 函数,先读取文件,然后解析该文件:

func readFromXMl(filename string, key interface{}) error {
	in, err := os.Open(filename)
	if err != nil {
		return err
	}

	decodeXML := xml.NewDecoder(in)
	err = decodeXML.Decode(key)
	if err != nil {
		return err
	}
	in.Close()
	return nil
}

func NewDecoder(r io.Reader) *Decoder 原型。该函数需要一个 io.Reader。我们将传递一个 os.File 变量到这个方法中。该函数为我们从文件中读取的每个表带返回一个指针数组。

本例中,NewDecoder() 从 in 中创建一个新的 XML 分析器。如果 in 没有实现 io.ByteReaderNewDecoder 会自行缓冲。

最后我们代码的完整部分如下:

package main

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

type Record struct {
	Name    string
	Surname string
	Tel     []Telephone
}

type Telephone struct {
	Mobile bool
	Number string
}

func readFromXMl(filename string, key interface{}) error {
	in, err := os.Open(filename)
	if err != nil {
		return err
	}
        // 创建 xml 解码器
	decodeXML := xml.NewDecoder(in)
	err = decodeXML.Decode(key)
	if err != nil {
		return err
	}
	in.Close()
	return nil
}

func main() {

	arguments := os.Args
	if len(arguments) == 1 {
		fmt.Println("Please provide a filename!")
		return
	}

	filename := arguments[1]

	var myRecord Record

	err := readFromXMl(filename, &myRecord)

	if err == nil {
		fmt.Println("XML:", myRecord)
	} else {
		fmt.Println(err)
	}
}

在终端执行该代码,得到如下结果:

$ go run main.go test.xml 
XML: {Yuzhou  [{true 12345678} {true 0755-12345}]}

总结

本文通过一个简单的示例帮助大家了解 encoding/xml 包中的一个 NewDecoder 函数,更多的内容大家可以去查看 XML 包,还有其他更丰富的函数等待探索,比如生成 XML 的函数,