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 關注
- 186 瀏覽
添加回答
舉報