golang 解析XML帶動態屬性
阿新 • • 發佈:2018-12-09
<DATASET name="WA_COMMON_010015" rmk="BCP 檔案資料結構"> <DATA> <ITEM key="B040021" eng="AUTH_TYPE" chn="認證型別" /> <ITEM key="C040002" eng="MAC" chn="終端 MAC 地址" /> <ITEM key="F030011" eng="AP_MAC" chn="AP 裝置 MAC 地址" /> <ITEM key="I070011" eng="COLLECTION_EQUIPMENT_ID" chn="AP 裝置編號" /> </DATA> </DATASET> <DATASET name="WA_COMMON_010014" rmk="BCP 資料檔案資訊"> <DATA> <ITEM key="H040003" val="attach" rmk="檔案路徑" /> <ITEM key="H010020" val="145-111111-1476152187-00003-WA_SOURCE_FJ_0001-0.bcp" rmk="檔名" /> <ITEM key="I010034" val="%d" rmk="記錄行數" /> </DATA> </DATASET>
問題描述
很顯然,上面一段XML檔案可以看出,ITEM中屬性名不同,但是在定義結構體的時候,解析DATASET 時候只能定義成切片,所以只能把 TTEM中的屬性弄成動態屬性,如下。
Attributes []xml.Attr `xml:",any,attr"`
程式碼例子
package main import ( "encoding/xml" "fmt" "io/ioutil" "os" ) type BcpData struct { XMLName xml.Name `xml:"MESSAGE"` Items []Item2 `xml:"ITEM"` Bcpdatainfo []BcpDatainfo `xml:"DATASET"` } type BcpDatainfo struct { Name string `xml:"name,attr"` Rmk string `xml:"rmk,attr"` BcpDatainfodetails []BcpDatainfodetail `xml:"DATA"` } type BcpDatainfodetail struct { Items []Item `xml:"ITEM"` } type Item2 struct { Key string `xml:"key,attr"` Val string `xml:"val,attr"` Rmk string `xml:"rmk,attr"` } type Item struct { Attributes []xml.Attr `xml:",any,attr"` } var data = `<MESSAGE> <ITEM key="I010032" val="\t" rmk="列分隔符(缺少值時預設為製表符\t) " /> <ITEM key="I010033" val="\n" rmk="行分隔符(缺少值時預設為換行符\n) " /> <ITEM key="A010004" val="WA_SOURCE_FJ_0001" rmk="資料集程式碼, 終端上下線資訊" /> <ITEM key="B050016" val="145" rmk="資料來源" /> <ITEM key="G020013" val="723005104" rmk="網安專用產品廠家組織機構程式碼" /> <ITEM key="I010038" val="1" rmk="資料起始行,可選項,不填寫預設為第1行" /> <ITEM key="I010039" val="UTF-8" rmk="可選項,預設為 UTF-8, BCP 檔案編碼格式(採用不帶格式的編碼方式,如: UTF-8無 BOM) " /> <DATASET name="WA_COMMON_010015" rmk="BCP 檔案資料結構"> <DATA> <ITEM key="B040021" eng="AUTH_TYPE" chn="認證型別" /> <ITEM key="B040022" eng="AUTH_ACCOUNT" chn="認證帳號" /> <ITEM key="G020004" eng="NETSERVERPORT_WACODE" chn="上網服務場所編碼" /> <ITEM key="H010015" eng="START_TIME" chn="上線時間" /> <ITEM key="H010016" eng="END_TIME" chn="下線時間" /> <ITEM key="F020001" eng="IP_ADDRESS" chn="場所內網 IP 地址" /> <ITEM key="C040002" eng="MAC" chn="終端 MAC 地址" /> <ITEM key="F030011" eng="AP_MAC" chn="AP 裝置 MAC 地址" /> <ITEM key="I070011" eng="COLLECTION_EQUIPMENT_ID" chn="AP 裝置編號" /> </DATA> </DATASET> <DATASET name="WA_COMMON_010014" rmk="BCP 資料檔案資訊"> <DATA> <ITEM key="H040003" val="attach" rmk="檔案路徑" /> <ITEM key="H010020" val="145-111111-1476152187-00003-WA_SOURCE_FJ_0001-0.bcp" rmk="檔名" /> <ITEM key="I010034" val="%d" rmk="記錄行數" /> </DATA> </DATASET> </MESSAGE>` func main() { v := new(BcpData) err := xml.Unmarshal([]byte(data), v) if err != nil { fmt.Printf("error: %v", err) return } xmlOutPut, _ := xml.MarshalIndent(v, " ", " ") headerBytes := []byte(xml.Header) xmlOutPutData := append(headerBytes, xmlOutPut...) ioutil.WriteFile("test11.xml", xmlOutPutData, os.ModeAppend) }