我正在学习在Go中创建XML。这是我的代码:
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>
但是我得到的是:
<?xml version="1.0" encoding="UTF-8"?> <request action="get-objects"> <point></point> </request>
我想念什么或做错什么?因为“ name,attr”东西对其他所有东西都适用(例如,如您所见,对于“ request”字段)。谢谢。
您的代码中有几处错误。在Go中使用编码包时,所有要编组/解组的字段都必须导出。请注意,结构本身不必导出。
因此,第一步是更改point结构以导出字段:
point
type point struct { Geo string `xml:"point"` Radius int `xml:"radius,attr"` }
现在,如果要Geo在点内显示字段,则必须添加,cdata到xml标记中。最后,无需向omitempty切片添加关键字。
Geo
,cdata
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"` }
去操场