
本文旨在解决 go 语言中使用 encoding/xml 包进行 XML 解析时,结构体字段无法被正确映射的问题。通过示例代码,详细解释了问题的根本原因,并提供了解决方案,帮助开发者避免类似错误,更有效地进行 XML 数据的处理。
在 Go 语言中使用 encoding/xml 包进行 XML 数据的序列化和反序列化时,经常会遇到结构体字段无法被正确映射的问题,导致解析结果为空或不符合预期。这通常是由于对 Go 语言的可见性规则理解不足造成的。
问题原因:字段未导出
Go 语言中,只有导出的字段(以大写字母开头的字段)才能被 encoding/xml 包访问。这是因为 encoding/xml 包使用反射机制来获取结构体的字段信息,而反射只能访问导出的字段。
解决方案:导出结构体字段
要解决这个问题,需要确保结构体中的所有字段都是导出的。这意味着字段名必须以大写字母开头。
以下面的代码为例,展示了如何正确地使用 encoding/xml 包进行 XML 解析:
package main import ( "encoding/xml" "fmt" "io/ioutil" ) type String struct { XMLName xml.Name `xml:"STRING"` Lang string `xml:"lang,attr"` // 导出 Lang 字段 Value string `xml:"value,attr"` // 导出 Value 字段 } type Entry struct { XMLName xml.Name `xml:"ENTRY"` Id string `xml:"id,attr"` // 导出 Id 字段 Strings []String } type Dictionary struct { XMLName xml.Name `xml:"DICTIONARY"` Type string `xml:"type,attr"` // 导出 Type 字段 Ignore string `xml:"ignore,attr"` // 导出 Ignore 字段 Entries []Entry } func main() { dict := Dictionary{} b := []byte(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <DICTIONARY type="multilanguage" ignore="en"> <ENTRY id="ActionText.Description.AI_ConfigureChainer"> <STRING lang="en" value="ActionText.Description.AI_ConfigureChainer"/> <STRING lang="da" value=""/> <STRING lang="nl" value=""/> <STRING lang="fi" value=""/> </ENTRY> </DICTIONARY> `) err := xml.Unmarshal(b, &dict) if err != nil { panic(err) } fmt.Println(dict) dict.Ignore = "test" out, err := xml.MarshalIndent(&dict, " ", " ") fmt.Println(string(out)) }
代码解释:
- 结构体定义: 在 String、Entry 和 Dictionary 结构体中,所有字段名都以大写字母开头,例如 Lang、Value、Id、Type 和 Ignore。
- XML 标签: xml:”…” 标签用于指定 XML 元素或属性与结构体字段之间的映射关系。
- xml.Unmarshal: xml.Unmarshal 函数用于将 XML 数据反序列化到结构体中。
- xml.MarshalIndent: xml.MarshalIndent 函数用于将结构体序列化为 XML 数据,并进行格式化输出。
运行结果:
修改后的代码可以正确地解析 XML 数据,并将数据映射到结构体中。同时,也可以正确地将结构体序列化为 XML 数据。
注意事项:
- 确保结构体字段的类型与 XML 数据的类型匹配。
- 使用 xml:”…” 标签来指定 XML 元素或属性与结构体字段之间的映射关系。
- 如果 XML 数据中包含未知的元素或属性,可以使用 xml:”,any” 标签来忽略它们。
总结:
在使用 encoding/xml 包进行 XML 解析时,务必确保结构体中的所有字段都是导出的。这是解决字段无法被正确映射问题的关键。通过理解 Go 语言的可见性规则,可以避免类似错误,更有效地进行 XML 数据的处理。


