我正在学习在Go中创建XML。这是我的代码:
myfunction.something
我希望输出如下:
type Request struct {
XMLName xml.Name `xml:"request"`
Action string `xml:"action,attr"`
...
Point []point `xml:"point,omitempty"`
}
type point struct {
geo string `xml:"point"`
radius int `xml:"radius,attr"`
}
func main() {
v := &Request{Action: "get-objects"}
v.Point = append(v.Point, point{geo: "55.703038, 37.554457", radius: 10})
output, err := xml.MarshalIndent(v, " ", " ")
if err != nil {
fmt.Println("error: %v\n", err)
}
os.Stdout.Write([]byte(xml.Header))
os.Stdout.Write(output)
}
但我得到的是:
<?xml version="1.0" encoding="UTF-8"?>
<request action="get-objects">
<point radius=10>55.703038, 37.554457</point>
</request>
我错过了什么或做错了什么? 因为“name,attr”对于其他所有事情都是完美的(例如,对于“请求”字段,如您所见)。 谢谢。
答案 0 :(得分:2)
您的代码中出现了一些问题。在Go中使用编码包时,必须导出要编组/解组的所有字段。请注意,不必导出结构本身。
因此,第一步是更改point
结构以导出字段:
type point struct {
Geo string `xml:"point"`
Radius int `xml:"radius,attr"`
}
现在,如果要在点内显示Geo
字段,则必须将,cdata
添加到xml标记中。最后,无需在切片中添加omitempty
关键字。
type Request struct {
XMLName xml.Name `xml:"request"`
Action string `xml:"action,attr"`
Point []point `xml:"point"`
}
type point struct {
Geo string `xml:",chardata"`
Radius int `xml:"radius,attr"`
}
答案 1 :(得分:1)
您要编组的成员必须导出(大写)。尝试:
type point struct {
Geo string `xml:"point"`
Radius int `xml:"radius,attr"`
}
struct的XML元素包含每个的编组元素 结构的导出字段。
[..]
因为Unmarshal使用反射包,它只能分配给 导出(大写)字段。