我有一个中间件,我收到JSON输入和用户凭据,需要抓取它们以构建包含各种其他数据的完整XML。
假设我有以下代码来解码JSON:
json.NewDecoder(r.Request.Body).Decode(entityPointer)
从这里构建XML的最有效方法是什么?
我以为我可以匹配struct并使用它们或用现有的XML模板解析它们并替换模板变量?
如果我有{username: '11', password: 'pass'}
作为请求,我怎样才能构建
答案 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))
}
检查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))
}