Go语言用encoding/xml包解析XML需定义带xml标签的导出结构体,通过xml.Unmarshal将字节数据转为对象;字段映射靠xml:"name,attr"等标签,嵌套结构体和切片分别处理子元素与同名列表,注意首字母大写、空元素零值及命名空间显式声明。
Go语言用encoding/xml包解析XML非常直接,不需要第三方库。核心是定义结构体并用结构标签(struct tag)映射XML元素和属性,再用xml.Unmarshal把字节数据转成Go对象。
XML解析的关键是让Go结构体“读懂”XML的层级和命名。字段名不重要,关键是xml标签里的值:
xml:"person" 表示该字段对应名为的XML元素xml:"name,attr" 表示读取name="xxx"这样的属性xml:",chardata" 表示读取元素的文本内容(比如25中的25)xml:"-" 表示忽略该字段[]Item)可解析多个同名元素假设有如下XML字符串:
对应结构体写法:
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包无法访问,不影响解析,可直接包含或忽略)会将对应字段设为零值,不是nil;需要区分时可用指针字段(如*string)xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance")需在结构体中显式声明xml:"xsi,attr"或用xml.Name字段捕获基本上就这些。Go的XML解析不复杂但容易忽略大小写和导出规则,对照XML样本写好结构体标签,再调一次Unmarshal,基本就跑通了。