如何在Go中编组具有可选标记的XML

3
这是我的问题代码:https://play.golang.org/p/X8Ey2hqmxL
package main

import (
    "encoding/xml"
    "fmt"
    "log"
)

type Carriage struct {
    MainCarriage interface{} `xml:"mainCarriage"`
}

type SeaCarriage struct {
    Sea          xml.Name `xml:"http://www.example.com/XMLSchema/standard/2012 sea"`
    LoadFactor   float64  `xml:"loadFactor,attr"`
    SeaCargoType string   `xml:"seaCargoType,attr"`
}

type RoadCarriage struct {
    Road xml.Name `xml:"http://www.example.com/XMLSchema/standard/2012 road"`
}

func main() {

    fr := Carriage{
        MainCarriage: SeaCarriage{
            LoadFactor:   70,
            SeaCargoType: "Container",
        },
    }
    xmlBlob, err := xml.MarshalIndent(&fr, "", "\t")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(xmlBlob))
}

我需要将数据编组成SOAP XML格式。目前我得到的结果是:
<Carriage>
    <mainCarriage loadFactor="70" seaCargoType="Container">
        <sea xmlns="http://www.example.com/XMLSchema/standard/2012"></sea>
    </mainCarriage>
</Carriage>

但是我需要这个结果:
<Carriage>
    <mainCarriage>
        <sea xmlns="http://www.example.com/XMLSchema/standard/2012" loadFactor="70" seaCargoType="Container"></sea>
    </mainCarriage>
</Carriage>

无论我尝试什么,都无法将结构体编组,以使loadFactor和seaCargoType成为sea标签的属性。
Carriage结构体采用空接口,因为根据运输类型,标签应该是海上或公路上的,但永远不会同时存在。
1个回答

2
mainCarriage字段标签之后添加>.,以表示您希望将该字段的内容放置在mainCarriage标记内。根据编组程序的要求,将Sea字段的名称更改为XMLName
package main

import (
    "encoding/xml"
    "fmt"
    "log"
)

type Carriage struct {
    MainCarriage interface{} `xml:"mainCarriage>."`
}

type SeaCarriage struct {
    XMLName      xml.Name `xml:"http://www.example.com/XMLSchema/standard/2012 sea"`
    LoadFactor   float64  `xml:"loadFactor,attr"`
    SeaCargoType string   `xml:"seaCargoType,attr"`
}

type RoadCarriage struct {
    Road xml.Name `xml:"http://www.example.com/XMLSchema/standard/2012 road"`
}

func main() {

    fr := Carriage{
        MainCarriage: SeaCarriage{
            LoadFactor:   70,
            SeaCargoType: "Container",
        },
    }
    xmlBlob, err := xml.MarshalIndent(&fr, "", "\t")
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(string(xmlBlob))
}

Playground


1
谢谢。>.是缺失的部分,而且这是我以前从未见过的东西。 - Jim Gaylard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接