xml - Golang XML 解码

标签 xml go

type Resp struct {
     Count string `xml:"totalRows"`
     Records []interface{} `xml:"data>record"`
}

type DepartmentRecord struct {
     DepID string `xml:"IDFIELD"`
}

type PersonRecord struct {
     UserID string `xml:"IDFIELD"`
}

我正在寻找一种方法来传递到 xml.Unmarshal Resp 结构中,该结构已更改为所需的记录类型。

最佳答案

首先,如果您想将不同类型的 slice 值分配给一个字段,您应该使用 interface{} 而不是 []interface{} 作为类型字段,否则您必须手动将 slice 中的每个元素转换为界面。

type Resp struct {
     Count   string      `xml:"totalRows"`
     Records interface{} `xml:"data>record"`
}

现在,由于字段的类型是 interface{},xml 解码器本身并不知道如何解码 xml 数据,因此该字段保持不变和未填充。要解决此问题,您可以通过预分配所需类型的值并将其分配给字段来协助解码器。

resp := new(Resp)
resp.Records = new([]DepartmentRecord)
xml.Unmarshal(data, resp)

或者,如果您想避免对 Records 字段进行解码后类型断言,请分配一个变量,将其分配给该字段,并在解码后使用该变量。

resp := new(Resp)
records := new([]DepartmentRecord)
resp.Records = records
xml.Unmarshal(data, resp)
// records is now populated and ready for use

请注意,我有意在 slice 类型上使用 new 而不是通常的 make,这是因为 new 返回分配的指向传入类型的零值的指针,我相信 xml 解码器需要 interface{} 字段的基础类型是指针类型而不是值类型,这就是 make 会返回。因此,在您使用记录 slice 之前,您需要取消引用它,因为它实际上是一个指针。

recs := *records

我猜上面的一个更好的版本应该是这样的:

resp := new(Resp)
records := make([]DepartmentRecord, 0)
resp.Records = &records
xml.Unmarshal(data, resp)
// records is now populated and ready for use

https://play.golang.org/p/FHEco6C69jw

关于xml - Golang XML 解码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50030691/

相关文章:

python - lxml.etree : Start tag expected, '<' 未找到,第 1 行,第 1 列

去优雅关闭负WaitGroup

go - Go Playground 和我机器上的 Go 之间存在差异?

list - 在 Go 中获取指向列表中结构的指针

java - 验证 "Invalid byte 1 of 1-byte UTF-8 sequence."中的 XML 文档结果

java - 在选项卡布局 fragment 中未显示其布局

http - 在 golang net/http 中处理 TLSNextProto 的正确方法是什么?

session - session 实现中的注册表

iphone - iOS XML 编写器类

c# - 将 'Which branch?' 字段添加到 TFS 中的工作项