在Golang中从JSON构造XML的最佳方法

时间:2014-09-17 22:46:50

标签: xml json go

我有一个中间件,我收到JSON输入和用户凭据,需要抓取它们以构建包含各种其他数据的完整XML。

假设我有以下代码来解码JSON:

json.NewDecoder(r.Request.Body).Decode(entityPointer)

从这里构建XML的最有效方法是什么?

我以为我可以匹配struct并使用它们或用现有的XML模板解析它们并替换模板变量?

如果我有{username: '11', password: 'pass'}作为请求,我怎样才能构建

以下的XML

1 个答案:

答案 0 :(得分:1)

您可以对XML和JSON使用相同的结构,例如:

type Person struct {
    Id        int    `xml:"id,attr"`
    FirstName string `xml:"name>first" json:"first"`
    LastName  string `xml:"name>last" json:"last"`
}

func main() {
    j := `{"id": 10, "first": "firstname", "last":"lastname"}`
    var p Person
    fmt.Println(json.Unmarshal([]byte(j), &p), p)
    out, _ := xml.MarshalIndent(p, "\t", "\t")
    fmt.Println(string(out))

}

playground

检查xml示例@ http://golang.org/pkg/encoding/xml/#example_Encoder

//修改

好吧,既然你已经拥有了一个模板,那么html/template可以使用example

const xmlTmpl = `<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE api SYSTEM "api.dtd">
<api version="6.0">
    <request>
<reqClient returnToken="N">
    <user>{{.AdminUsername}} </user>
    <password>{{.AdminPassword}}</password>
</reqClient><reqValidate returnBalance="Y">
    <userName>{{.Username}}</userName>
    <password>{{.Password}}</password>
    <channel>M</channel>
</reqValidate></request>
</api>
`

var tmpl = template.Must(template.New("foo").Parse(xmlTmpl))

type Entity struct {
    AdminUsername      string `json:"-"`
    AdminPassword      string `json:"-"`
    Username, Password string
}

func main() {
    e := Entity{Username: "User", Password: "Loser"}
    //json.NewDecoder(r.Request.Body).Decode(&e)
    e.AdminUsername = "admin" // fill admin user/pass after parsing the request
    e.AdminPassword = "admin-password"
    fmt.Println(tmpl.Execute(os.Stdout, e))
}