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

时间:2016-05-28 23:05:12

标签: xml go

我正在学习在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”对于其他所有事情都是完美的(例如,对于“请求”字段,如您所见)。 谢谢。

2 个答案:

答案 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"`
}

Go playground

答案 1 :(得分:1)

您要编组的成员必须导出(大写)。尝试:

type point struct {
    Geo    string `xml:"point"`
    Radius int    `xml:"radius,attr"`
}

来自encoding/xml doc

  

struct的XML元素包含每个的编组元素   结构的导出字段

     

[..]

     

因为Unmarshal使用反射包,它只能分配给   导出(大写)字段