当前位置:网站首页>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()边栏推荐
猜你喜欢

科普達人丨漫畫圖解什麼是eRDMA?

Qualcomm released the "magic mirror" of the Internet of things case set, and digital agriculture has become a reality

OpenMLDB Meetup No.4 会议纪要

Xu Lei expressed three thanks for the most difficult 618 in 19 years

线下门店为什么要做新零售?

科普达人丨漫画图解什么是eRDMA?

HMS Core音频编辑服务3D音频技术,助力打造沉浸式听觉盛宴

There are so many kinds of coupons. First distinguish them clearly and then collect the wool!

60 个神级 VS Code 插件!!

限时预约|6 月 Apache Pulsar 中文开发者与用户组会议
随机推荐
R语言ggplot2可视化分面图(facet):gganimate包基于transition_time函数创建动态散点图动画(gif)、使用labs函数为动画图添加动态时间标题
zabbix监控TCP连接个数
Goto statement jump uninitialized variable: c2362
Esp32-c3 introductory tutorial question ⑨ - core 0 panic 'ed (load access fault) Exception was unhandled. vfprintf. c:1528
wallys/IPQ8074a/2x(4 × 4 or 8 × 8) 11AX MU-MIMO DUAL CONCURRENT EMBEDDEDBOARD
Automatic database growth
QT embeds the sub QT program window into the current program
Alibaba cloud database represented by polardb ranks first in the world
Quel est le rôle du rétroéclairage LED?
R language view version R package view version
如何通过GDB分析Native Crash
深入解析 Apache BookKeeper 系列:第四篇—背压
goto语句跳转未初始化变量:C2362
OpenMLDB Meetup No.4 会议纪要
[revisiting the classic C language] ~x,%c,%d,%x, etc. in C language, the role of the address character in C language, and the consortium in C language
60 个神级 VS Code 插件!!
EMC-浪涌
Qualcomm released the "magic mirror" of the Internet of things case set, and digital agriculture has become a reality
wallys/600VX – 2×2 MIMO 802.11ac Mini PCIe Wi-Fi Module, Dual Band, 2,4GHz / 5GHz QCA 9880
Xu Lei expressed three thanks for the most difficult 618 in 19 years