Go语言用encoding/xml包解析XML需定义带xml标签的导出结构体,通过xml.Unmarshal将字节数据转为对象;字段映射靠xml:"name,attr"等标签,嵌套结构体和切片分别处理子元素与同名列表,注意首字母大写、空元素零值及命名空间显式声明。

Go语言用encoding/xml包解析XML非常直接,不需要第三方库。核心是定义结构体并用结构标签(struct tag)映射XML元素和属性,再用xml.Unmarshal把字节数据转成Go对象。
结构体字段与XML标签对齐
XML解析的关键是让Go结构体“读懂”XML的层级和命名。字段名不重要,关键是xml标签里的值:
-
xml:"person"表示该字段对应名为的XML元素 -
xml:"name,attr"表示读取name="xxx"这样的属性 -
xml:",chardata"表示读取元素的文本内容(比如中的25 25) -
xml:"-"表示忽略该字段 - 嵌套结构体自动对应子元素;切片字段(如
[]Item)可解析多个同名元素
解析简单XML示例
假设有如下XML字符串:
对应结构体写法:
立即学习“go语言免费学习笔记(深入)”;
type User struct {
ID int `xml:"id,attr"`
Name string `xml:"name"`
Age int `xml:"age"`
}
解析代码:
data := []byte(``) var u User err := xml.Unmarshal(data, &u) if err != nil { log.Fatal(err) } // u.ID == 101, u.Name == "张三", u.Age == 30 张三 30
处理多层嵌套和列表
遇到这类结构,用切片+嵌套结构体即可:
type Users struct {
XMLName xml.Name `xml:"users"`
List []User `xml:"user"`
}
type User struct {
ID int `xml:"id,attr"`
Name string `xml:"name"`
Tags []Tag `xml:"tag"`
}
type Tag struct {
Name string `xml:",chardata"`
}
这样就能完整解析。
注意常见坑点
- 结构体字段必须是导出的(首字母大写),否则
xml包无法访问 - 如果XML有声明
,不影响解析,可直接包含或忽略 - 空元素(如
)会将对应字段设为零值,不是nil;需要区分时可用指针字段(如*string) - 命名空间(如
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance")需在结构体中显式声明xml:"xsi,attr"或用xml.Name字段捕获
基本上就这些。Go的XML解析不复杂但容易忽略大小写和导出规则,对照XML样本写好结构体标签,再调一次Unmarshal,基本就跑通了。










