gpt4 book ai didi

xml-serialization - Go XML 编码和根元素

转载 作者:IT王子 更新时间:2023-10-29 00:41:03 26 4
gpt4 key购买 nike

在 Go 中,您可以将结构编码为 XML,例如:

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))
}

产生输出:

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

我的问题是,person 类型是小写的“p”,因为我希望它对包私有(private)。但我希望 XML 元素是大写的:<Person> .结构中的字段可以使用标签(例如 `xml:"name"`)针对结构字段编码为其他名称,但这似乎不是结构类型的选项。

我有一个使用模板的变通方法,但如果知道更好的答案就更好了。

最佳答案

根据encoding/xml.Marshal文档:

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

您可以在结构中的 XMLName 字段上使用标记来覆盖人员结构的 XML 标记名称。为了避免将其放入您的实际人员结构中,您可以创建一个匿名结构来嵌入您正在编码的人员结构。

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))
}

关于xml-serialization - Go XML 编码和根元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12398925/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com