1 回答
TA贡献1851条经验 获得超4个赞
通常对于这些情况,您可以在 Go 中使用切片来“收集”元素,并使用,any选项将您没有映射的所有内容放入其中。为了能够识别来源,请使用一个XMLName xml.Name字段,该字段将保留它源自的 XML 标记的名称。
例如,您可以像这样对 XML 进行建模:
type Ht struct {
Criteria struct {
Nodes []struct {
XMLName xml.Name
Content string `xml:",chardata"`
} `xml:",any"`
}
Session struct {
ID string `xml:"id,attr"`
Htd struct {
ID string `xml:"ID,attr"`
DataX []struct {
XMLName xml.Name
Info struct {
Count int `xml:"Count,attr"`
}
DataNodes []struct {
XMLName xml.Name
ID string `xml:"Id,attr"`
Type string
} `xml:",any"`
} `xml:",any"`
}
} `xml:"session"`
}
解析它并重新编码它将保留所有元素:
var ht Ht
if err := xml.Unmarshal([]byte(src), &ht); err != nil {
panic(err)
}
result, err := xml.MarshalIndent(ht, "", " ")
if err != nil {
panic(err)
}
fmt.Println(string(result))
这将输出(在Go Playground上尝试):
<Ht>
<Criteria>
<ADNode_1>2</ADNode_1>
<CDNode_1>2</CDNode_1>
<IFNode_1>0</IFNode_1>
<ADNode_2>2</ADNode_2>
<CDNode_2>0</CDNode_2>
<IFNode_2>0</IFNode_2>
<ADNode_3>0</ADNode_3>
<CDNode_3>0</CDNode_3>
<IFNode_3>0</IFNode_3>
</Criteria>
<session id="1056134770841202228344907">
<Htd ID="21170">
<Data_1>
<Info Count="2"></Info>
<Data Id="iV29308/B2/R1">
<Type>TR1</Type>
</Data>
<Data Id="iV29308/B3/R1">
<Type>TR1</Type>
</Data>
<Data Id="iV29308/B4/R1">
<Type>TR1</Type>
</Data>
<Data Id="iV29308/B6/R1">
<Type>TR1</Type>
</Data>
</Data_1>
<Data_2>
<Info Count="2"></Info>
<Data Id="iV29308/B2/R1">
<Type>TR2</Type>
</Data>
<Data Id="iV29308/B3/R1">
<Type>TR2</Type>
</Data>
<Data Id="iV29308/B4/R1">
<Type>TR2</Type>
</Data>
<Data Id="iV29308/B6/R1">
<Type>TR3</Type>
</Data>
</Data_2>
</Htd>
</session>
</Ht>
- 1 回答
- 0 关注
- 173 浏览
添加回答
举报