Go语言encoding/xml包通过结构体标签实现XML编解码,支持解析与生成。需定义可导出字段的结构体,用xml标签映射元素和属性,如xml:"name"对应节点名,attr表示属性,chardata获取文本内容,可用xml.Unmarshal解析数据,xml.MarshalIndent生成格式化XML,结合XMLName、切片和嵌套结构处理复杂结构。

Go语言的encoding/xml包提供了对XML数据的编解码支持,适合处理结构清晰的XML内容。使用它,你可以将XML解析为结构体,也可以将结构体序列化为XML字符串。整个过程依赖标签(struct tags)来映射字段。
定义结构体映射XML元素
要解析XML,先根据数据结构定义对应的Go结构体。通过xml标签控制字段与XML节点的对应关系。
xml包无法访问。
示例XML:
Alice 30 Beijing
对应的结构体:
立即学习“go语言免费学习笔记(深入)”;
type Person struct {
XMLName xml.Name `xml:"person"`
Name string `xml:"name"`
Age int `xml:"age"`
City string `xml:"city"`
}
XMLName字段用于指定根元素名称,不是必需的,但有助于反序列化时匹配。
解析XML字符串或文件
使用xml.Unmarshal将XML数据解析到结构体中。
示例代码:
data := `` var p Person err := xml.Unmarshal([]byte(data), &p) if err != nil { log.Fatal(err) } fmt.Printf("%+v\n", p) Alice 30 Beijing
输出:
{XMLName:{Space: Local:person} Name:Alice Age:30 City:Beijing}
若从文件读取,可用ioutil.ReadFile或os.Open配合xml.NewDecoder逐个解析。
使用xml.NewDecoder读取文件示例:
网趣购物系统静态版支持网站一键静态生成,采用动态进度条模式生成静态,生成过程更加清晰明确,商品管理上增加淘宝数据包导入功能,与淘宝数据同步更新!采用领先的AJAX+XML相融技术,速度更快更高效!系统进行了大量的实用性更新,如优化核心算法、增加商品图片批量上传、谷歌地图浏览插入等,静态版独特的生成算法技术使静态生成过程可随意掌控,从而可以大大减轻服务器的负担,结合多种强大的SEO优化方式于一体,使
file, err := os.Open("person.xml")
if err != nil {
log.Fatal(err)
}
defer file.Close()
var p Person
decoder := xml.NewDecoder(file)
err = decoder.Decode(&p)
if err != nil {
log.Fatal(err)
}
处理属性和嵌套结构
XML属性用attr标签标识,嵌套元素则通过嵌套结构体表示。
带属性的XML示例:
alice@example.com
对应结构体:
type Person struct {
XMLName xml.Name `xml:"person"`
ID string `xml:"id,attr"`
Active bool `xml:"active,attr"`
Contact Contact `xml:"contact"`
}
type Contact struct {
Type string `xml:"type,attr"`
Value string `xml:",chardata"`
}
其中chardata表示该字段应填充XML元素的文本内容。
解析后,Contact.Value会得到alice@example.com。
生成XML输出
使用xml.MarshalIndent或xml.Marshal将结构体转换为XML。
示例:
p := Person{
ID: "123",
Active: true,
Contact: Contact{
Type: "email",
Value: "alice@example.com",
},
}
output, err := xml.MarshalIndent(p, "", " ")
if err != nil {
log.Fatal(err)
}
fmt.Println(xml.Header + string(output))
xml.Header通常为,可手动添加。
输出:
常见技巧:alice@example.com
- 忽略字段:使用
xml:"-" - 处理命名空间:在标签中写
xml:"ns uri person" - 切片处理重复元素:
xml:"item"自动匹配多个同名节点 - 使用
interface{}或xml.Token处理不规则结构









