我尝试将XML数据解析为JSON文件,但是当我开始将封送处理的数据写入JSON时,它只是将数据重写为JSON文件,因此,我的文件带有最后一个XML元素。如何将整个数据写入JSON文件?
将XML和封送数据解析为JSON的代码片段
decoder := xml.NewDecoder(file)
resultData := map[string]map[string]string{}
for {
t, _ := decoder.Token()
if t == nil {
break
}
switch et := t.(type) {
case xml.StartElement:
if et.Name.Local == "profile" {
var object XMLProfile
decoder.DecodeElement(&object, &et)
resultData = map[string]map[string]string{
object.ProfileName: {},
}
for _, val := range object.Fields {
resultData[object.ProfileName][val.Name] = val.Value
}
}
}
}
if out, err := json.MarshalIndent(resultData, "", "\t"); err != nil {
panic(err)
} else {
_ = ioutil.WriteFile("test.json", out, 0644)
}
期望JSON:
{
"Profile 1": {
"role": "user"
},
"Profile 2": {
"role": "user"
},
"Profile 3": {
"role": "admin"
}
}
实际JSON:
{
"Profile 3": {
"role": "admin"
}
}
答案 0 :(得分:0)
似乎您在每次迭代后都在名为“ profile”的节点中重新创建resultData。发生这种情况时,只有最后一个会到达您编写JSON的代码。
尝试一下:
decoder := xml.NewDecoder(file)
resultData := map[string]map[string]string{}
for {
t, _ := decoder.Token()
if t == nil {
break
}
switch et := t.(type) {
case xml.StartElement:
if et.Name.Local == "profile" {
var object XMLProfile
decoder.DecodeElement(&object, &et)
resultData[object.ProfileName] = map[string]string{}
for _, val := range object.Fields {
resultData[object.ProfileName][val.Name] = val.Value
}
}
}
}
if out, err := json.MarshalIndent(resultData, "", "\t"); err != nil {
panic(err)
} else {
_ = ioutil.WriteFile("test.json", out, 0644)
}
我还将检查XML中是否没有出现重复的ProfileName,因为它将覆盖先前的条目。