golang 解析XML带动态属性

<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)
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值