
本文介绍如何使用 Go 的 encoding/xml 包正确解析形如 12 的嵌套同名简单元素数组,重点讲解结构体标签中路径表达式的用法及常见误区。
本文介绍如何使用 go 的 `encoding/xml` 包正确解析形如 `
在 Go 中解析 XML 时,若遇到一组同名、无属性、仅含文本内容的简单元素(如多个
正确的结构体定义方式
最简洁有效的写法是直接在字段标签中指定 XPath 式路径:
type MyElement struct {
Ids []int `xml:"Ids>int"`
}
该标签表示:从当前元素(MyElement)出发,先查找子元素 Ids,再在其内部提取所有名为 int 的子元素的文本内容,并自动转换为 []int 类型。
更进一步,Go 的 xml 包支持相对路径简写——以 ">" 开头的标签会自动以当前字段名作为起始路径。因此,以下写法等价且更灵活(尤其当外层容器名可能变化时):
type MyElement struct {
Ids []int `xml:">int"`
}
✅ 这种写法隐式等价于 "Ids>int",前提是 Ids 字段名与 XML 中的父容器标签名一致。
完整可运行示例
package main
import (
"encoding/xml"
"fmt"
"log"
)
type MyElement struct {
Ids []int `xml:"Ids>int"`
}
func main() {
data := `
<myelement><ids><int>1</int><int>2</int><int>42</int></ids></myelement>`
var elem MyElement
if err := xml.Unmarshal([]byte(data), &elem); err != nil {
log.Fatal(err)
}
fmt.Printf("Parsed IDs: %v\n", elem.Ids) // 输出:[1 2 42]
}
常见错误与注意事项
- ❌ 错误写法:Ids int[] — Go 不支持 int[] 语法,应使用 []int;
- ❌ 错误写法:Ids []int 但无 xml 标签 — 默认会匹配同名 XML 元素
,而非其内部的 ; - ❌ 嵌套结构体如 type Ids struct { ID []intxml:"int"} 无法生效,因为 xml 解析器不会自动将同名叶子节点“提升”到嵌套结构字段中;
- ✅ 标签中的路径支持多级嵌套,例如 xml:"Root>Items>Item>Value";
- ✅ 所有匹配到的文本节点会按文档顺序自动解析并追加至切片,无需手动循环;
- ⚠️ 注意字段必须是导出字段(首字母大写),否则 xml 包无法反射访问。
掌握 xml:"parent>child" 和 xml:">child" 这两种路径模式,即可高效处理绝大多数“扁平化同名数组”类 XML 结构,避免冗余中间类型,让解析逻辑既简洁又健壮。











