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 有一条记录,所以我们需要两个结构体:Record 和 Telphone :
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.ByteReader,NewDecoder 会自行缓冲。
最后我们代码的完整部分如下:
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 的函数,