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则是想要获取的节点元素。