Go语言通过encoding/xml包提供XML解析与序列化能力,核心是结构体标签映射、xml.Unmarshal/xml.Marshal双向转换及xml.Token流式解析。
Go语言通过encoding/xml包提供了简洁、高效的XML解析与序列化能力,无需第三方库即可完成结构化XML的读写。核心在于用结构体标签(xml:)精准映射XML元素和属性,再配合xml.Unmarshal或xml.Marshal完成双向转换。
结构体字段需通过xml标签声明其在XML中的对应关系。常用标签值包括:
xml:"name":匹配XML元素名(如 → xml:"title")xml:",attr":表示该字段为当前元素的XML属性(如id="123" → ID string `xml:"id,attr"`)xml:",chardata":捕获元素的纯文本内容(如Hello → Text string `xml:",chardata"`)xml:",any":接收未定义字段的任意子元素(慎用,适合松散结构)xml:",omitempty":序列化时若字段为空则忽略该元素使用xml.U将XML数据解码为Go结构体:
nmarshal
err := xml.Unmarshal([]byte(xmlStr), &v)
data, _ := os.ReadFile("data.xml"); xml.Unmarshal(data, &v)
xml:"rss channel:item")用xml.Marshal将结构体转为XML字节流,可直接打印或写入文件:
output, err := xml.MarshalIndent(v, "", " ") 支持缩进美化输出XMLName xml.Name `xml:"root"`字段,可自定义根元素名[]Item → 多个)omitempty可跳过对格式多变或无法预定义结构的XML,可用xml.Token进行流式解析:
xml.Decoder,循环调用Token()逐个读取开始标签、字符数据、结束标签等基本上就这些。掌握结构体标签规则和Unmarshal/Marshal的典型用法,就能覆盖大多数XML处理场景。流式解析作为补充手段,在特殊需求下再启用。