GoLang之xml

go xml struct

type WXMessage struct {
	ToUserName   string   `xml:"ToUserName"`
	FromUserName string   `xml:"FromUserName"`
	CreateTime   int      `xml:"CreateTime"`
	MsgType      string   `xml:"MsgType"`
	Content      string   `xml:"Content"`
}

这么使用会有一点问题,当

res, _ := xml.Marshal(WXMessage)

res的结构将变成

<WXMessage>
    <ToUserName>...</ToUserName>
    ...
</WXMessage>

不是真正意义上的xml结构

解决方案

在struct头一行定义xml的名称,如下:

type WXMessage struct {
	XMLName      xml.Name `xml:"xml"`
	ToUserName   string   `xml:"ToUserName"`
	FromUserName string   `xml:"FromUserName"`
	CreateTime   int      `xml:"CreateTime"`
	MsgType      string   `xml:"MsgType"`
	Content      string   `xml:"Content"`
}

这样解析出来的xml将正确地显示

<xml>
    <ToUserName>...</ToUserName>
    ...
</xml>

微信开发中的xml

微信开发中经常有如下结构:

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>12345678</CreateTime>
  <MsgType><![CDATA[image]]></MsgType>
</xml>

需要对xml里的<、>等进行转义,如何转义呢? 只要在struct声明`xml:",innerxml"` 里面的内容将成为内置对象,不会将 < 转换成&it;

总结

(1)通过创建一个名为XMLName、类型为xml.Name的字段,可以将XML元素的名字存储在这个字段里面。

(2)通过创建一个与XML元素属性同名的字段,并使用xml:“,attr”作为该字段的结构标签,可以将元素的属性的值存储到这个字段里面。

(3)通过创建一个与XML元素相同的字段,并使用xml:“,chardata”作为该字段的结构标签,可以将XML元素的字符数据存储到这个字段里面。

(4)通过定义一个任意名字字段,并使用XML:“,innerxml”作为该字段的结构标签,可以将XML元素中的原始XML存储到这个字段里面。

(5)没有模式标签(如,attr、,chardata或者,innerxml)的结构字段将与同名的XML元素匹配。

(6)使用xml:“a>b>c”这样的结构标签可以在不指定树桩结构的情况下直接获取指定的XML元素,其中a和b为中间元素,而c则是想要获取的节点元素。