先上简单可以直接运行的例子:
package main
import (
"encoding/xml"
"fmt"
)
type Servers struct {
XMLName xml.Name `xml:"servers,omitempty"`
Version string `xml:"version,attr"`
Svs *server `xml:"server,omitempty"`
}
type server struct {
ServerName string `xml:"serverName,omitempty"`
//指针类型,可以使 当其属性含有标签,cdata、,chardata,且其标签没有值的时候,不显示空标签
ServerIP *ServerIP `xml:"serverIP,omitempty"`
}
type ServerIP struct {
Id string `xml:"id,attr,omitempty"`
Value string `xml:",cdata"'`
}
func main() {
var v Servers
//var server server
v.Svs.ServerIP = &ServerIP{"Shanghai_VPN","sdalkg"}
//v.Svs = append(v.Svs, server{ServerName:"Shanghai_VPN"})
//v.Svs = append(v.Svs, server{ServerName:"Beijing_VPN", ServerIP:&ServerIP{Id:"12",Value:"127.0.0.2"}})
output, err := xml.MarshalIndent(v, "", " ")
if err != nil {
fmt.Printf("error: %v\n", err)
}
myString := []byte(xml.Header + string(output))
//将字节流转换成string输出
fmt.Println(string(myString))
}
运行结果:
<?xml version="1.0" encoding="UTF-8"?>
<servers version="1">
<server>
<serverName>Shanghai_VPN</serverName>
</server>
<server>
<serverName>Beijing_VPN</serverName>
<serverIP id="12"><![CDATA[127.0.0.2]]></serverIP>
</server>
</servers>
空标签的现实问题:
一个空标签打印输出是这样:
<value></value>
但是谷歌浏览器识别XML实际展示的是这样:
<value/>
所以下次不要想我这次一样犯傻,总看想着打印输出的为什么不能是半个标签呢。其实只是显示问题。
标签使用介绍:
tag中含有"-"的字段不会输出
tag中含有"name,attr",会以name作为属性名,字段值作为值输出为这个XML元素的属性,如上version字段所描述
tag中含有",attr",会以这个struct的字段名作为属性名输出为XML元素的属性,类似上一条,只是这个name默认是字段名了。
tag中含有",chardata",输出为xml的 character data而非element。
tag中含有",innerxml",将会被原样输出,而不会进行常规的编码过程
tag中含有",comment",将被当作xml注释来输出,而不会进行常规的编码过程,字段值中不能含有"--"字符串
tag中含有"omitempty",如果该字段的值为空值那么该字段就不会被输出到XML,空值包括:false、0、nil指针或nil接口,任何长度为0的array, slice, map或者string