一尘不染

在GOlang中整理XML:字段为空(APPEND不起作用?)

go

我正在学习在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”字段)。谢谢。


阅读 419

收藏
2020-07-02

共1个答案

一尘不染

您的代码中有几处错误。在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"`
}

去操场

2020-07-02