GoLang XML封送处理自定义无根元素的封送

问题描述

如何在没有根元素的情况下进行封送?

type Ids struct {
  Id []string `xml:"id"`
}

Idsstr,_ := xml.Marshal(&Ids{[]string{"test1","test2"}})

Idsstr输出为:

<Ids><id>test1</id><id>test2</id></Ids>

应该没有Ids元素:

<id>test1</id><id>test2</id>

Playground

解决方法

type id string 

func main() {
    IdsStr,_ := xml.Marshal([]id{"test1","test2"})
    fmt.Println(string(IdsStr))
}

Playground

type id string

type Ids struct {
    Vals []id 
}

func main() {
    ids := &Ids{[]id{"test1","test2"}}
    IdsStr,_ := xml.Marshal(ids.Vals)
    fmt.Println(string(IdsStr))
}

Playground

0utput

<id>test1</id><id>test2</id>
,

...但是如何设置元素的自愿xml名称? Vals [] id xml:“ idSomeOther”在xml编组后返回id,因为它是类型的名称...我需要自定义类型id来键入IdXml,但是xml编组后应返回id。我怎么能得到它?

您可以使用XMLName xml.Name,标记xml:",chardata"(等等)来自定义struct

type Customs struct {
    Vals []CustomXml
}

type CustomXml struct {
    XMLName xml.Name
    Chardata string `xml:",chardata"`
}

func main() {
    customs := Customs{
        []CustomXml{
            {XMLName: xml.Name{Local: "1"},Chardata: "XXX"},{XMLName: xml.Name{Local: "2"},Chardata: "YYY"}},}
    res,_ := xml.Marshal(customs.Vals)
    fmt.Println(string(res))
}

0utput

<1>XXX</1><2>YYY</2>

Playground

??另外,请查看src/encoding/xml/上的示例。