Go语言XML生成和解析

前言

XML是指可扩展标记语言(eXtensible MarkupLanguage),它是一种标记语言。它被设计的宗旨是描述数据(XML),而非显示数据(HTML)。

在日常开发中是比较流行的传输和存储数据结构。

Go语言中,我们用xml包的Unmarshal来解析XML文档,MarshalIndent来生成XML文档。

XML文档实例

<?xml version="1.0" encoding="utf-8"?>
<devices version="1">
    <device>
        <deviceName>智能摄像头</deviceName>
        <deviceCode>100000000001</deviceCode>
        <deviceDate>2020-03-01</deviceDate>
    </device>
    <device>
        <deviceName>智能挖掘机</deviceName>
        <deviceCode>200000000001</deviceCode>
        <deviceDate>2020-03-01</deviceDate>
    </device>
</devices>

定义结构

type Device struct {
	XMLName     xml.Name     `xml:"devices"`
	Version     string       `xml:"version,attr"`
	Device      []DeviceNode `xml:"device"`
	Description string       `xml:",innerxml"`
}

type DeviceNode struct {
	XMLName    xml.Name `xml:"device"`
	DeviceName string   `xml:"deviceName"`
	DeviceCode string   `xml:"deviceCode"`
	DeviceDate string   `xml:"deviceDate"`
}

Tag解释

  • "-",字段不会输出
  • "name,attr",以name作为属性名,字段值作为输出这个XML元素的属性
  • ",attr",以这个结构体struct的字段名作为属性名输出XML元素的属性,name默认是字段名
  • ",chardata",输出XML元素为character data而非element。
  • ",innerxml",原样输出,不进行常规的编码过程
  • ",comment",作为XML注释来输出,不进行编码过程,字段中不能有“--”字符串
  • "omitempty",若字段值为空、那么字段不会被输出到XML,空值有:false、0、nil指针,nil接口,任意长度为0的Slice、数组结构、Map结构或者string

生成XML

	var o = Device{}
	o.Device = append(o.Device, DeviceNode{
		DeviceName: "电脑",
		DeviceCode: "300000000001",
		DeviceDate: "2020-01-01",
	})

	o.Device = append(o.Device, DeviceNode{
		DeviceName: "游戏机",
		DeviceCode: "400000000001",
		DeviceDate: "2020-01-02",
	})

	o.Device = append(o.Device, DeviceNode{
		DeviceName: "苹果手机",
		DeviceCode: "500000000001",
		DeviceDate: "2020-01-03",
	})

	resXML, err := xml.MarshalIndent(o, " ", " ")
	if err != nil {
		fmt.Printf("marshal xml err :%v\n", err)
		return
	}

	_, _ = os.Stdout.Write([]byte(xml.Header))
	_, _ = os.Stdout.Write(resXML)

解析XML

	file := "./device.xml"
	fd, err := os.Open(file)
	if err != nil {
		fmt.Printf("open file err : %v\n", err)
		return
	}
	defer fd.Close()

	fileContent, err := ioutil.ReadAll(fd)
	if err != nil {
		fmt.Printf("read file err : %v\n", err)
		return
	}

	var device = Device{}
	err = xml.Unmarshal(fileContent, &device)

	if err != nil {
		fmt.Printf("unmarshal err : %v\n", err)
		return
	}

	for idx, node := range device.Device {
		fmt.Printf("序号:[%d],设备名:[%s],设备编码:[%s],设备日期:[%s]\n",
			idx, node.DeviceName, node.DeviceCode, node.DeviceDate)
	}

运行结果

发布了146 篇原创文章 · 获赞 17 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/guichenglin/article/details/105218193