Golang中如何忽略XML中的字段
Golang中如何忽略XML中的字段 我有一个结构体
type UserData struct {
SomeData struct {
AnotherData []struct {
Data1 string `xml:"pair1" json:"pair1"`
Data2 string `xml:"pair2" json:"pair2"`
Data3 float64 `xml:"rate" json:"rate"`
InnerData struct {
InnerData1 float64 `xml:"inner1" json:"inner1"`
InnerData2 float64 `xml:"inner2" json:"inner2"`
} `xml:"innerdata" json:"innerdata"`
} `xml:"anotherdata" json:"anotherdata"`
} `json:"somedata" xml:"somedata"`
}
当我将这个结构体编码为 XML 时,我得到以下输出
<userData>
<someData>
...
</someData>
我如何才能省略 userData?XML 应该以 someData 开始,而不是以 userData 开始。
<someData>
...
</someData>
更多关于Golang中如何忽略XML中的字段的实战教程也可以访问 https://www.itying.com/category-94-b0.html
4 回复
我遇到了一个错误:xml: unsupported type: struct
更多关于Golang中如何忽略XML中的字段的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
您可以直接对内部的 SomeData 字段进行序列化。
var d UserData = ...
bs, err := xml.Marshal(&d.SomeData)
好的,那么给这个类型起个名字;
package main
import "fmt"
func main() {
var m map[string]int
fmt.Println(m == nil)
m["key"] = 1
}
可以通过在结构体字段上使用 xml:",innerxml" 标签来忽略外层包装元素。以下是修改后的代码示例:
type UserData struct {
SomeData struct {
AnotherData []struct {
Data1 string `xml:"pair1" json:"pair1"`
Data2 string `xml:"pair2" json:"pair2"`
Data3 float64 `xml:"rate" json:"rate"`
InnerData struct {
InnerData1 float64 `xml:"inner1" json:"inner1"`
InnerData2 float64 `xml:"inner2" json:"inner2"`
} `xml:"innerdata" json:"innerdata"`
} `xml:"anotherdata" json:"anotherdata"`
} `xml:",innerxml" json:"somedata"`
}
编码时直接使用 SomeData 字段:
package main
import (
"encoding/xml"
"fmt"
)
func main() {
data := UserData{
SomeData: struct {
AnotherData []struct {
Data1 string `xml:"pair1" json:"pair1"`
Data2 string `xml:"pair2" json:"pair2"`
Data3 float64 `xml:"rate" json:"rate"`
InnerData struct {
InnerData1 float64 `xml:"inner1" json:"inner1"`
InnerData2 float64 `xml:"inner2" json:"inner2"`
} `xml:"innerdata" json:"innerdata"`
} `xml:"anotherdata" json:"anotherdata"`
}{
AnotherData: []struct {
Data1 string `xml:"pair1" json:"pair1"`
Data2 string `xml:"pair2" json:"pair2"`
Data3 float64 `xml:"rate" json:"rate"`
InnerData struct {
InnerData1 float64 `xml:"inner1" json:"inner1"`
InnerData2 float64 `xml:"inner2" json:"inner2"`
} `xml:"innerdata" json:"innerdata"`
}{
{
Data1: "value1",
Data2: "value2",
Data3: 1.23,
InnerData: struct {
InnerData1 float64 `xml:"inner1" json:"inner1"`
InnerData2 float64 `xml:"inner2" json:"inner2"`
}{
InnerData1: 4.56,
InnerData2: 7.89,
},
},
},
},
}
output, err := xml.MarshalIndent(data.SomeData, "", " ")
if err != nil {
panic(err)
}
fmt.Println(xml.Header + string(output))
}
输出结果将以 <someData> 直接开始:
<?xml version="1.0" encoding="UTF-8"?>
<someData>
<anotherdata>
<pair1>value1</pair1>
<pair2>value2</pair2>
<rate>1.23</rate>
<innerdata>
<inner1>4.56</inner1>
<inner2>7.89</inner2>
</innerdata>
</anotherdata>
</someData>
如果需要完全省略 UserData 结构体,可以直接定义 SomeData 类型:
type SomeData struct {
AnotherData []struct {
Data1 string `xml:"pair1" json:"pair1"`
Data2 string `xml:"pair2" json:"pair2"`
Data3 float64 `xml:"rate" json:"rate"`
InnerData struct {
InnerData1 float64 `xml:"inner1" json:"inner1"`
InnerData2 float64 `xml:"inner2" json:"inner2"`
} `xml:"innerdata" json:"innerdata"`
} `xml:"anotherdata" json:"anotherdata"`
}
然后直接编码 SomeData 实例。

