虽然当前基于XML的API应用不多,但是Gin也提供了便捷的XML生成,可以把这些用于需要XML的地方,比如网站的sitemap,rss订阅的atom等。

来个map试试

  1. func main() {
  2. r := gin.Default()
  3. r.GET("/xml", func(c *gin.Context) {
  4. c.XML(200, gin.H{"wechat": "bfire_vip", "blog": "www.bfire.vip"})
  5. })
  6. r.Run(":8080")
  7. }

在Gin中,要生成XML,只需要使用context.XML方法即可。以上的例子,我们运行访问浏览器http://localhost:8080/xml可以看到如下信息:

  1. <map>
  2. <wechat>bfire_vip</wechat>
  3. <blog>www.bfire.vip</blog>
  4. </map>

根节点是map,这是因为gin.H其实就是一个map,map的key成为了xml里的节点,而map的value成为了xml节点的值。

自定义struct

对于自定义的struct,Gin同样可以很方便的转为XML。

  1. func main() {
  2. r := gin.Default()
  3. r.GET("/xml", func(c *gin.Context) {
  4. c.XML(200, User{ID: 123, Name: "张三", Age: 20})
  5. })
  6. r.Run(":8080")
  7. }
  8. type User struct {
  9. ID int
  10. Name string
  11. Age int
  12. }

这个例子和 Golang Gin 实战(八)| JSON渲染输出 非常相似,现在我们运行再通过浏览器访问看看。

  1. <User>
  2. <ID>123</ID>
  3. <Name>张三</Name>
  4. <Age>20</Age>
  5. </User>

根节点已经变成了这个structUser,而根节点下的节点,就是User的字段。

自定义节点名字

和JSON一样,我们也可以通过字段的xml tag来自定义对应的字段的别名。

  1. type User struct {
  2. ID int `xml:"id"`
  3. Name string `xml:"name"`
  4. Age int `xml:"age"`
  5. }

只需要改成这样,我们再打开浏览器访问,发现已经变了。

  1. <User>
  2. <id>123</id>
  3. <name>张三</name>
  4. <age>20</age>
  5. </User>

已经变成我们重新定义好的别名了。Gin的xml生成,使用的是Golang内置的encoding/xml,所以可以像使用encoding/xml一样,来自定义我们的XML格式。

xml数组

XML的数组和JSON的不一样,因为XML必须要有一个根节点,所以我们必须要有一个对象存放我们的struct数组,比如map.

  1. func main() {
  2. r := gin.Default()
  3. r.GET("/xml", func(c *gin.Context) {
  4. allUsers := []User{{ID: 123, Name: "张三", Age: 20}, {ID: 456, Name: "李四", Age: 25}}
  5. c.XML(200, gin.H{"user": allUsers})
  6. })
  7. r.Run(":8080")
  8. }
  9. type User struct {
  10. ID int `xml:"id"`
  11. Name string `xml:"name"`
  12. Age int `xml:"age"`
  13. }

使用一个gin.H存放,key是user,我们运行查看信息:

  1. <map>
  2. <user>
  3. <id>123</id>
  4. <name>张三</name>
  5. <age>20</age>
  6. </user>
  7. <user>
  8. <id>456</id>
  9. <name>李四</name>
  10. <age>25</age>
  11. </user>
  12. </map>

已经是一个数组了。

小结

XML其实已经越来越不常用了,我们自己开发API,还是要用JSON的方式。不光XML不常用,其实Gin提供的YAML的支持更不常用,而且Gin提供的YAML的用法和XML、JSON基本一样,所以不再进行介绍,大家可以自己练练

原文地址:
https://www.flysnow.org/2020/01/03/golang-gin-xml-rendering.html