xml在 golang 中使用该包时,我在解组非同质类型列表时遇到了麻烦。考虑以下 XML 文档,其嵌套元素是非同类类型的列表:
<mydoc>
<foo>Foo</foo>
<bar>Bar</bar>
<foo>Another Foo</foo>
<foo>Foo #3</foo>
<bar>Bar 2</bar>
</mydoc>
以及以下用于测试 XML 解组/编组的 golang 代码(也在go playground 上):
package main
import "encoding/xml"
import "fmt"
const sampleXml = `
<mydoc>
<foo>Foo</foo>
<bar>Bar</bar>
<foo>Another Foo</foo>
<foo>Foo #3</foo>
<bar>Bar 2</bar>
</mydoc>
`
type MyDoc struct {
XMLName xml.Name `xml:"mydoc"`
Items []Item
}
type Item interface {
IsItem()
}
type Foo struct {
XMLName xml.Name `xml:"foo"`
Name string `xml:",chardata"`
}
func (f Foo) IsItem() {}
type Bar struct {
XMLName xml.Name `xml:"bar"`
Nombre string `xml:",chardata"`
}
func (b Bar) IsItem() {}
func main() {
doMarshal()
doUnmarshal()
}
func doMarshal() {
myDoc := MyDoc{
Items: []Item{
Foo{Name: "Foo"},
Bar{Nombre: "Bar"},
Foo{Name: "Another Foo"},
Foo{Name: "Foo #3"},
Bar{Nombre: "Bar 2"},
},
}
bytes, err := xml.MarshalIndent(myDoc, "", " ")
if err != nil {
panic(err)
}
// Prints an XML document just like "sampleXml" above.
println(string(bytes))
}
func doUnmarshal() {
myDoc := MyDoc{}
err := xml.Unmarshal([]byte(sampleXml), &myDoc)
if err != nil {
panic(err)
}
// Fails to unmarshal the "Item" elements into their respective structs.
fmt.Printf("ERR: %#v", myDoc)
}
您将看到它doMarshal()生成了我期望的确切 XML 文档;但是,doUnmarshal()无法将“Item”元素反序列化为它们各自的结构。我已经尝试了一些更改,但似乎没有什么能让它们正确地解组(创建存储myDoc.Items,将“项目”的类型更改为[]*Item[和其他],摆弄 XML 标签等)。
任何想法如何xml.Unmarshal(...)反序列化不相关类型的元素列表?
富国沪深
相关分类