<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)
}