Go 的 encoding/xml 包支持通过结构体标签精准映射 XML 元素,其中 ,chardata 标签用于提取元素的文本值,配合 attr 可同时解析属性和内容。
go 的 `encoding/xml` 包支持通过结构体标签精准映射 xml 元素,其中 `,chardata` 标签用于提取元素的文本值,配合 `attr` 可同时解析属性和内容。
在 Go 中解析带属性和文本内容的 XML 元素(如
以下是一个完整、可运行的示例,对应你提供的 XML 结构:
package main
import (
"encoding/xml"
"fmt"
)
type Packaging struct {
Depth Measurement `xml:"depth"`
Height Measurement `xml:"height"`
}
type Measurement struct {
Unit string `xml:"measurementUnitCode,attr"`
Value float64 `xml:",chardata"` // ✅ 正确:捕获元素内纯文本(如 "1200")
}
func main() {
xmlData := `<packaging><depth measurementunitcode="MMT">1200</depth><height measurementunitcode="MMT">1320</height></packaging>`
var pkg Packaging
err := xml.Unmarshal([]byte(xmlData), &pkg)
if err != nil {
panic(err)
}
fmt.Printf("Depth: %.0f %s\n", pkg.Depth.Value, pkg.Depth.Unit) // 输出:Depth: 1200 MMT
fmt.Printf("Height: %.0f %s\n", pkg.Height.Value, pkg.Height.Unit) // 输出:Height: 1320 MMT
}
⚠️ 注意事项:
- ,chardata 必须单独作为 tag 值,不可与其他路径或名称混用(例如 xml:"value,chardata" 是错误的);
- 字段类型需与实际文本内容兼容:float64 要求内容为有效数字,否则 Unmarshal 会返回错误;
- 若 XML 内容可能为空或含空格,建议先用 string 类型接收,再手动转换(增强健壮性);
- xml:",chardata" 仅作用于直接子文本,不递归解析嵌套元素。
✅ 总结:要同时提取 XML 元素的属性和文本值,结构体中应分别用 ,attr 和 ,chardata 标签明确标注——这是 encoding/xml 包解析混合内容的标准且唯一可靠方式。











