正如标题所述,我试图将我的XML直接解组到地图中,而不必首先解组成结构,然后将结构转换为地图。我正在处理一个相当大的数据集,双转换花费的时间超过了预期。
如果有人可以就此提供任何指导,我们将不胜感激。
XML:classAccesses重复,还有一些其他元素。
<classAccesses>
<apexClass>AccountRelationUtility</apexClass>
<enabled>true</enabled>
</classAccesses>
我当前的结构:我首先解析每个标题元素,然后用子元素创建一个新的结构
type classAccesses struct {
ApexClass string `xml:"apexClass"`
Enabled string `xml:"enabled"`
}
type diffs struct {
ClassAccesses []classAccesses `xml:"classAccesses"`
}
期望的地图:我想保留diffs结构,但我想要子结构&#34; ClassAccesses&#34;变得类似于下面的地图。
map[string]string {
"ApexClass": "enabled"
}
答案 0 :(得分:1)
从Go 1.3开始,无法使用标准Go库将XML文档直接解组到地图中。
此处给出了标准库的XML部分http://golang.org/pkg/encoding/xml/,没有任何函数可以完全按照您在问题中的要求进行操作。
根据您的具体情况,您可能还有其他选项,例如:
答案 1 :(得分:0)
如果您创建实现xml.Unmarshaller interface的类型,则可以将数据直接编组到map [string] string中。
type classAccessesMap struct {
m map[string]string
}
func (c *classAccessesMap) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
c.m = map[string]string{}
key := ""
val := ""
for {
t, _ := d.Token()
switch tt := t.(type) {
// TODO: parse the inner structure
case xml.StartElement:
fmt.Println(">", tt)
case xml.EndElement:
fmt.Println("<", tt)
if tt.Name == start.Name {
return nil
}
if tt.Name.Local == "enabled" {
c.m[key] = val
}
}
}
}
这是部分解决方案; https://play.golang.org/p/7aOQ5mcH6zQ