Go语言怎么解析XML encoding/xml包用法

Go语言用encoding/xml包解析XML需定义带xml标签的导出结构体,用xml.Unmarshal反序列化;支持元素映射、属性绑定、文本捕获、任意子元素接收及嵌套切片处理,并注意命名空间、大小写和空元素等细节。

Go语言用encoding/xml包解析XML非常直接,核心是通过结构体标签(xml:)控制字段与XML元素的映射关系,再用xml.Unmarshal完成反序列化。

定义结构体并设置XML标签

结构体字段需用xml标签声明对应XML节点名、属性或特殊行为。常见写法:

  • xml:"name":匹配同名XML元素(区分大小写)
  • xml:"name,attr":绑定XML属性(如ID string `xml:"id,attr"`
  • xml:",chardata":捕获文本内容(如HelloText string `xml:",chardata"`
  • xml:",any":接收未定义字段的任意子元素(需类型为[]bytexml.Name等)
  • xml:"-" :忽略该字段

解析XML字符串或文件

xml.Unmarshal将字节切片或io.Reader转为结构体:

data := `Alice30`
var p Person
err := xml.Unmarshal([]byte(data), &p)
if err != nil {
    log.Fatal(err)
}

读文件时可传入*os.Filebytes.NewReader等满足io.Reader接口的对象。

立即学习“go语言免费学习笔记(深入)”;

处理嵌套与重复元素

XML中常见嵌套结构和多个同名子元素:

  • 嵌套:结构体字段类型设为另一个结构体即可(如Address Address `xml:"address"`
  • 重复元素(如多个):字段类型用切片(如Items []Item `xml:"item"`
  • 混合内容(元素内含文本+子元素):用xml:",any"配合xml.CharData或自定义解析逻辑

注意点和常见坑

解析时容易忽略的关键细节:

  • 结构体字段必须首字母大写(即导出),否则Unmarshal无法访问
  • XML命名空间(如xmlns:ns="http://example.com")需在标签中显式写全,如xml:"ns:name"
  • 空元素(如)会正确映射为零值,无需额外判断
  • 如果XML有DOCTYPE或注释,Unmarshal默认跳过,不影响解析