我在golang中编写了一个xml响应API。按照xml documentation中的示例,很容易创建xml,为它们提供属性等等。
问题是我需要使用相同名称和不同顺序的多个标签。
<block>
<tag1>A Value1</tag1>
<tag2>B Value1</tag2>
<tag1>A Value2</tag1>
</block>
创建类似
的结构type Tag1 struct {
Value string `xml:",chardata"`
}
type Tag2 struct {
Value string `xml:",chardata"`
}
type Block struct {
XMLName xml.Name `xml:"block"`
Tags1 []Tag1 `xml:"tag1"`
Tags2 []Tag2 `xml:"tag2"`
}
I achieved这个xml:
<block>
<tag1>A Value1</tag1>
<tag1>A Value2</tag1>
<tag2>B Value1</tag2>
</block>
由于block
定义中的数组类型而导致的。我想要的是一种将数组类型定义为继承两个Tag
类型的接口的方法。喜欢这个
type Block struct {
XMLName xml.Name `xml:"block"`
Tags []Tags `xml:"tags"`
}
type (Tags t) Tag1 struct{
Value string `xml:",chardata"`
}
type (Tags t) Tag2 struct{
Value string `xml:",chardata"`
}
这样我就可以按照
的附加顺序定义xml中的出现顺序a1 := Tag1{"A Value1"}
b1 := Tag2{"B Value1"}
a2 := Tag1{"A Value2"}
arr := []Tags{}
arr = append(arr,a1)
arr = append(arr,b1)
arr = append(arr,a2)
v.Tags = arr
我已经做了一些阅读,并且我试图避免实现xml包中使用的编组功能。感谢任何帮助。谢谢。
答案 0 :(得分:0)
我解决了不同的问题。我只是没有找到正确的方法。 This question描述了我需要的东西。通过在Tag1
结构中定义[]interface{}
值,我可以以编程方式定义标记的名称。然后只需在旧朋友type Tag1 struct {
XMLName xml.Name
Value string `xml:",chardata"`
}
type Block struct {
XMLName xml.Name `xml:"block"`
Tags []interface{}
}
a1 := Tag1{XMLName: xml.Name{Local: "tag1"}, Value: "A Value1"}
a2 := Tag1{XMLName: xml.Name{Local: "tag1"}, Value: "A Value2"}
b1 := Tag2{XMLName: xml.Name{Local: "tag2"}, Value: "B Value1"}
v := &Block{}
v.Tags = []interface{}{a1, b1, a2}
类型中包含不同的Tags值。
static Items()
{
items = Enumerable.Repeat(new Item(), Count).AsParallel().ToList();
}
检查this example以便播放。