douchui1488 2012-09-13 03:14
浏览 12
已采纳

进行XML编组和根元素

In Go, you can marshall a struct to XML, e.g.:

package main

import (
    "encoding/xml"
    "fmt"
    )

type person struct {
    Name string
    Starsign string
}

func main() {
    p := &person{"John Smith", "Capricorn"}
    b,_ := xml.MarshalIndent(p,"","   ")
    fmt.Println(string(b))
}

produces output:

<person>
   <Name>John Smith</Name>
   <Starsign>Capricorn</Starsign>
</person>

My problem is, the person type is lower-case "p" because I want that to be private to the package. But I'd prefer the XML element to be uppercase: <Person>. The fields within the struct can be marshalled to other names using tags (e.g. `xml:"name"`) against the structure fields but this doesn't seem to be an option for the structure type.

I have a work-around using templates, but it would be nice to know a better answer.

  • 写回答

2条回答 默认 最新

  • dongzhi5846 2012-09-13 04:02
    关注

    According to the encoding/xml.Marshal documentation:

    The name for the XML elements is taken from, in order of preference:

    • the tag on the XMLName field, if the data is a struct
    • the value of the XMLName field of type xml.Name
    • the tag of the struct field used to obtain the data
    • the name of the struct field used to obtain the data
    • the name of the marshalled type

    You can use a tag on the XMLName field in the struct to override the person struct's XML tag name. In order to avoid putting it in your actual person struct, you can create an anonymous struct that embeds the person struct you are marshaling.

    package main
    
    import (
        "encoding/xml"
        "fmt"
    )
    
    type person struct {
        Name        string
        Starsign    string
    }
    
    func marshalPerson(p person) ([]byte, error) {
        tmp := struct {
            person
            XMLName struct{}    `xml:"Person"`
        }{person: p}
    
        return xml.MarshalIndent(tmp, "", "   ")
    }
    
    func main() {
        p := person{"John Smith", "Capricorn"}
        b, _ := marshalPerson(p)
        fmt.Println(string(b))
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥50 分布式追踪trace异常问题
  • ¥15 人在外地出差,速帮一点点
  • ¥15 如何使用canvas在图片上进行如下的标注,以下代码不起作用,如何修改
  • ¥15 Windows 系统cmd后提示“加载用户设置时遇到错误”
  • ¥50 vue router 动态路由问题
  • ¥15 关于#.net#的问题:End Function
  • ¥15 无法import pycausal
  • ¥15 weditor无法连接模拟器Local server not started, start with?
  • ¥20 6-3 String类定义
  • ¥15 嵌入式--定时器使用