xml.Unmarshal适合解析结构固定的XML,需定义导出字段并显式声明xml tag;xml.Decoder适用于大型或动态XML,支持流式解析;命名空间和字符实体需手动处理。
用 xml.Unmarshal 解析已知结构的 XML 文件
Go 标准库的 xml 包适合处理结构固定、字段明确的 XML,比如配置文件或 API 响应。核心是定义与 XML 元素一一对应的 Go 结构体,并用 xml.Unmarshal 加载内容。
常见错误:结构体字段未导出(首字母小写),或缺少 xml tag 导致字段始终为空;XML 中的属性(attribute)未用 attr 标识,被当成子元素忽略。
- 结构体字段必须大写开头(可导出),且推荐显式声明
xmltag,例如XMLName xml.Name `xml:"book"` - 属性需用
attr,如ID string `xml:"id,attr"` - 文本内容用
chardata,如Content string `xml:",chardata"` - 嵌套元素直接嵌入结构体字段,无需额外包装
示例片段:
type Book struct {
XMLName xml.Name `xml:"book"`
ID string `xml:"id,attr"`
Title string `xml:"title"`
Author string `xml:"author"`
}
data, _ := os.ReadFile("book.xml")
var b Book
xml.Unmarshal(data, &b) // 注意传指针
用 xml.Decoder 流式解析大型或嵌套不规则 XML
当 XML 文件很大(百 MB 级)、结构动态(如混合标签、未知层级)、或只需提取部分节点时,xml.Decoder 更合适。它逐 token 解析,内存占用低,可控性强。
容易踩的坑:忘记调用 decoder.Token() 向前推进;对 xml.StartElement 和 xml.CharData 的顺序判断不严谨;未处理命名空间导致匹配失败。