Go的encoding/xml包通过结构体标签实现XML与Go类型的双向映射,支持属性、文本、嵌套、切片及忽略字段等特性,用Unmarshal解析、Marshal生成XML。
Go 的 encoding/xml 包是标准库中处理 XML 的核心工具,主打结构化、类型安全、简洁高效。它不提供流式解析(如 SAX)或 DOM 树操作,而是通过 Go 结构体与 XML 元素一一映射,用 xml.Unmarshal 解析,xml.Marshal 生成。
XML 解析的关键是让 Go 结构体“知道”每个字段对应哪个 XML 元素或属性。靠的是结构体字段的 xml 标签:
xml:"name":匹配名为 name 的子元素(默认行为)xml:"name,attr":匹配名为 name 的 XML 属性(如 中的 id)xml:",chardata":捕获元素的文本内容(如 Hello 中的 Hello)xml:",omitempty":序列化时若字段为空(零值),则忽略该元素或属性xml:"-" :完全忽略该字段(不解析也不生成)示例:
type Person struct {用 xml.Unmarshal 将 XML 数据(字节切片或 io.Reader)解码进结构体实例:
[]byte(x
mlStr) 转为字节切片os.Open 打开后传入 xml.NewDecoder,更省内存(尤其大文件)xml.SyntaxError 或字段类型不匹配等错误简单例子:
data := `用 xml.Marshal 把结构体转成 XML 字节切片,再用 string() 或写入文件:
xml.MarshalIndent,传入前缀和缩进符(如 "", " "))?需手动拼接,Marshal 不自动生成omitempty 可跳过输出结构体可自然表达嵌套关系:
[]Child → 自动解析多个同名子元素为切片xml:",any" 捕获未知子元素(返回 []byte,需二次解析)xml:",innerxml" 获取某元素内部所有原始 XML(包括子标签和文本)例如支持多个 的 Library:
基本上就这些。不需要第三方库,标准包已足够应对绝大多数 XML 场景——只要 XML 结构相对固定,且你愿意用结构体建模。