如何使用Golang encoding/xml编码嵌套结构体
解决Golang encoding/xml生成嵌套结构XML的问题
你当前的结构体定义没有包含目标XML里的<Types>节点,且层级可以简化。以下是调整后的实现方案:
简化版结构体定义
利用XML标签的parent>child语法,可以直接在根结构体里指定层级关系,减少结构体嵌套:
package main import ( "encoding/xml" "fmt" "os" ) type Request struct { XMLName xml.Name `xml:"Request"` // 用`Types>Type`标签表示这些Type节点属于Types节点的子节点 TypeList []TypeNode `xml:"Types>Type"` } type TypeNode struct { // 每个Type节点内部的Type文本节点 Type string `xml:"Type"` }
构造数据并编码
func main() { // 构造请求数据 req := Request{ TypeList: []TypeNode{ {Type: "Type1"}, {Type: "Type2"}, // 可以添加更多Type节点 }, } // MarshalIndent生成带缩进的XML,更易读 output, err := xml.MarshalIndent(req, "", " ") if err != nil { fmt.Printf("编码XML失败: %v\n", err) os.Exit(1) } // 加上XML声明头并输出 fmt.Println(xml.Header + string(output)) }
输出结果
运行后会生成你期望的XML格式:
<?xml version="1.0" encoding="UTF-8"?> <Request> <Types> <Type> <Type>Type1</Type> </Type> <Type> <Type>Type2</Type> </Type> </Types> </Request>
另一种拆分结构体的方案
如果你更喜欢明确的层级拆分,也可以把Types单独定义为结构体:
type Request struct { XMLName xml.Name `xml:"Request"` Types Types `xml:"Types"` } type Types struct { TypeNodes []TypeNode `xml:"Type"` } type TypeNode struct { Type string `xml:"Type"` }
构造数据时只需调整为:
req := Request{ Types: Types{ TypeNodes: []TypeNode{ {Type: "Type1"}, {Type: "Type2"}, }, }, }
编码逻辑和输出结果完全一致。
内容的提问来源于stack exchange,提问作者an nguyen
相关产品推荐
相关产品推荐

