当前位置:网站首页>Go 语言入门很简单:Go 处理 XML 文件
Go 语言入门很简单:Go 处理 XML 文件
2022-06-30 11:32:00 【InfoQ】
读取 XML 文件
test.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>RecordTelphonetype 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
}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
}
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}]}解析 XML
NewParser()io.Reader()Parsertest.xml<?xml version="1.0" encoding="utf-8"?>
<servers version="1">
<server>
<serverName>Shanghai_VPN</serverName>
<serverIP>127.0.0.1</serverIP>
</server>
<server>
<serverName>Beijing_VPN</serverName>
<serverIP>127.0.0.2</serverIP>
</server>
</servers>Unmarshal()func Unmarshal(data []byte, v interface{}) errortype Recurlyservers struct {
XMLName xml.Name `xml:"servers"`
Version string `xml:"version,attr"`
Svs []server `xml:"server"`
Description string `xml:",innerxml"`
}
type server struct {
XMLName xml.Name `xml:"server"`
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}package main
import (
"encoding/xml"
"fmt"
"io/ioutil"
"os"
)
type Recurlyservers struct {
XMLName xml.Name `xml:"servers"`
Version string `xml:"version,attr"`
Svs []server `xml:"server"`
Description string `xml:",innerxml"`
}
type server struct {
XMLName xml.Name `xml:"server"`
ServerName string `xml:"serverName"`
ServerIP string `xml:"serverIP"`
}
func main() {
file, err := os.Open("test.xml") // For read access.
if err != nil {
fmt.Printf("error: %v", err)
return
}
defer file.Close()
data, err := ioutil.ReadAll(file)
if err != nil {
fmt.Printf("error: %v", err)
return
}
v := Recurlyservers{}
err = xml.Unmarshal(data, &v)
if err != nil {
fmt.Printf("error: %v", err)
return
}
fmt.Println(v)
}
xml.Unmarshal{{ servers} 1 [{{ server} Shanghai_VPN 127.0.0.1} {{ server} Beijing_VPN 127.0.0.2}]
<server>
<serverName>Shanghai_VPN</serverName>
<serverIP>127.0.0.1</serverIP>
</server>
<server>
<serverName>Beijing_VPN</serverName>
<serverIP>127.0.0.2</serverIP>
</server>
}xml.Unmarshalxml:"serverName"func Unmarshal(data []byte, v interface{}) error- 结构体 struct
- 切片 slice
- 字符串 string
Unmarshal- 如果 struct 的第二个参数是
string或者[]byte型,并且它的 tag 含有",innerxml",Unmarshal将会将此位置所对应的元素内所有内嵌的原始 xml 累加到此位置上,如上面例子 Description 定义。最后的输出是:
<server>
<serverName>Shanghai_VPN</serverName>
<serverIP>127.0.0.1</serverIP>
</server>
<server>
<serverName>Beijing_VPN</serverName>
<serverIP>127.0.0.2</serverIP>
</server>总结
encoding/ XMLNewDecoder()Unmarshal()边栏推荐
- EMC-浪涌
- Esp32-c3 introductory tutorial basic part ⑫ - mass production burning device configuration and serial number, NVS partition confirmation, NVS partition generation program, CSV to bin
- TypeScript ReadonlyArray(只读数组类型) 详细介绍
- 科普达人丨漫画图解什么是eRDMA?
- Lucene全文检索工具包学习笔记总结
- led背光板的作用是什麼呢?
- 10 days to learn how to flutter Day10 flutter play animation and packaging
- nvm安装node后,在使用npm指令时候显示不是内部或外部指令
- 又被 Kotlin 语法糖坑惨的一天
- Alibaba cloud lifeifei: China's cloud database has taken the lead in many mainstream technological innovations abroad
猜你喜欢

The first batch in China! Alibaba cloud native data Lake products have passed the evaluation and certification of the ICT Institute

数据库连接池 druid

国产数据库的黄金周期要来了吗?

A quietly rising domestic software, low-key and powerful!

限时预约|6 月 Apache Pulsar 中文开发者与用户组会议

Object mapping - mapping Mapster

What is erdma as illustrated by Coptic cartoon?

建立自己的网站(13)

A theoretical defect of relative position coding transformer and Its Countermeasures

如何通过GDB分析Native Crash
随机推荐
Object mapping - mapping Mapster
Typescript readonlyarray (read only array type) details
EMC surge
Dameng data rushes to the scientific innovation board, or becomes the "first share of domestic database" in the A-share market
R语言ggplot2可视化:使用ggplot2可视化散点图、aes函数中的colour参数指定不同分组的数据点使用不同的颜色显示
盘点那些具有特色的写作软件
A theoretical defect of relative position coding transformer and Its Countermeasures
使用cookie技术实现历史浏览记录并控制显示的个数
A quietly rising domestic software, low-key and powerful!
达梦数据冲刺科创板,或成A股市场“国产数据库第一股”
学习redis实现分布式锁—–自己的一个理解
Evaluation of IP location query interface Ⅲ
go-zero微服务实战系列(八、如何处理每秒上万次的下单请求)
CVPR 2022 | greatly reduce the manual annotation required for zero sample learning. Mapu and Beiyou proposed category semantic embedding rich in visual information
科普達人丨漫畫圖解什麼是eRDMA?
限时预约|6 月 Apache Pulsar 中文开发者与用户组会议
1175. prime permutation
koa - 洋葱模型浅析
R语言ggplot2可视化:使用ggplot2可视化散点图、使用scale_size函数配置数据点的大小的(size)度量调整的范围
安装onnx很慢,使用清华镜像