本次遇到的问题是我需要将一堆的键值对转换为xml格式,作为body去请求url
interface{}类型转换为xml格式
1.第一种方法
// 定义一个user结构体
type User struct {
Name string `xml:"name,omitempty"`
Age int `xml:"age,omitempty"`
}
// 定义一个Blog结构体
type Blog struct {
Title string `xml:"title,omitempty"`
Content string `xml:"content,omitempty"`
}
// 在Request结构体中包含上面两个结构体
type Request struct {
User
Blog
}
// 新建一个user
user := &User{Name: "张三", Age: 23}
// 将user放到Request结构体中,在结构体的字段中都添加omitempty,在显示的时候就会只显示有值的,无值的就不会显示了,返回值中的<Request>...</Request>是结构体的名字
request := &Request{User: *user}
result, _ := xml.Marshal(request)
fmt.Println(string(result)) // <Request><name>张三</name><age>23</age></Request>
2. 第二种方法
type User struct {
XMLName xml.Name `xml:"Request"`
Name string `xml:"name,omitempty"`
Age int `xml:"age,omitempty"`
}
type Blog struct {
// 定义类型为xml.Name就不会使用结构体的名字<Blog>,而是自定义的<Request>
XMLName xml.Name `xml:"Request"`
Title string `xml:"title,omitempty"`
// content>再来 生成的xml是这样的<content><再来>人之初,性本善</再来></content>,类似于标签套标签
Content string `xml:"content>再来,omitempty"`
}
user := &User{Name: "张三", Age: 23}
g, _ := xml.Marshal(user)
fmt.Println(string(g))
blog := &Blog{Title: "三字经", Content: "人之初,性本善"}
result, _ := xml.Marshal(blog)
fmt.Println(string(result)) // <Request><title>三字经</title><content>人之初,性本善</content></Request>
3. 格式化的xml
上述的生成的xml实在是对阅读太不友好,换一个函数试试
xml.MarshalIndent(v interface{}, prefix, indent string)
type Blog struct {
XMLName xml.Name `xml:"Request"`
Title string `xml:"title,omitempty"`
Content string `xml:"content>再来,omitempty"`
}
blog := &Blog{Title: "三字经", Content: "人之初,性本善"}
result, _ := xml.MarshalIndent(blog, "", " ")
fmt.Println(string(result))
//<Request>
// <title>三字经</title>
// <content>
// <再来>人之初,性本善</再来>
// </content>
//</Request>