跳转到主内容
极星编程网:以代码为星,赴技术山海!

Go语言如何解析XML数据_Golang encoding/xml标签映射方法

Go的xml包解析XML时静默失败主因是结构体与XML结构不匹配:字段需首字母大写、xml标签须严格一致(含大小写/下划线/短横线)、属性用,attr、文本用,chardata、单层XML需XMLName指定根名、重复元素用切片绑定元素名、空元素为零值、命名空间等需手动预处理。 Go 的
encoding/xml
包解析 XML 时,字段不填、全为零值,不是代码写错了,而是结构体定义和 XML 实际结构没对上——它不会报错,只会静默跳过。 xml:"tag" 标签必须显式写,且大小写/下划线完全一致 Go 不会自动把
UserID
字段映射到
或
。字段名和 XML 标签名默认无转换规则,必须靠
xml:"user_id"
显式绑定。 字段必须首字母大写(否则不可导出,
xml.Unmarshal
看不见)
xml:"user-id"
才能匹配
123
,写成
xml:"userid"
或
xml:"UserId"
都失败 XML 中有下划线、短横线、大写字母混用时,
xml
标签里的字符串必须一字不差 属性要用 ,attr,文本内容要用 ,chardata 把
hello
当成一个整体去映射,很容易漏掉关键修饰符。
ID string `xml:"id,attr"`
→ 正确提取属性值
"123"
Text string `xml:",chardata"`
→ 正确提取元素内文本
"hello"
,不是
xml:"item"
写成
xml:"id"
会去找子元素
123
,不是属性 写成
xml:"item"
会去找子元素
hello
,不是当前元素的内容 单层 XML(无外层根节点)不能直接套结构体 像
oss-cn-hangzhou
这种只有一个顶层标签的 XML,若定义
type BucketLocation struct { LocationConstraint string `xml:"LocationConstraint"` }
,
xml.Unmarshal
会失败——它期望根是
,但实际是
。 go语言参考手册 中文CHM版 Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。本文给大家带来Go参考手册,需要的可以来下载! Go是从2007年末由Robert Griesemer, Rob Pike, Ken Thompson主持开发,后来还加入了Ian Lance Taylor, Russ Cox等人,并最终于2009年11月开源,在2012年早些时候发布了Go 1稳定版本。现在Go的开发已经是完全开放的,并且拥有一个活跃的社区。 Go 语言特色 简洁、快速、安全 并行、有趣、开源 内存管理、v数组安全、编译 下载 立即学习 “ go语言免费学习笔记(深入) ”; 简单场景:直接解码到
string
指针,
err := xml.Unmarshal(data, &location)
扩展场景:结构体字段名无关紧要,但整个结构体要“假装”是根元素,可加
XMLName xml.Name `xml:"locationconstraint"`
字段强制指定根名 别指望靠字段名自动推导根标签;
xml:
标签只管字段和子节点的对应,不管文档根 嵌套重复元素必须用切片,且 xml:"item" 绑定的是元素名,不是字段名 XML 中多个同名子元素(如
ab
),不能靠字段名
Items []Item
自动识别,得靠标签明确告诉解析器:“这些
都归这里”。
Items []Item `xml:"item"`
→ 正确收集所有
子元素 写成
Items []Item `xml:"items"`
会去找
...
,不是你要的 嵌套层级必须和结构体嵌套一致;
...
对应两层结构体,不能跳级 空元素(如
)会被解析为零值,不是 nil;需要区分语义时得额外加字段或预处理 最常被忽略的一点:命名空间、CDATA、HTML 实体、编码声明(如
encoding="GBK"
)都不被原生支持。遇到就先用
bytes.ReplaceAll
去掉命名空间前缀,或用
strings.ReplaceAll
展开实体,否则字段照样静默为空。

相关文章