arrays - Marshal 一个 JSON Marshal 兼容映射到 XML

标签 arrays xml go marshalling

我有一张 map :[]map[string]string .

将结果填充到 json.marshal()兼容的对象。输出:

[
  {
    "key1": "val1",
    "key2": "val2"
  },
  {
    "randval3": "val1",
    "randval2": "xyz1"
    "randval1": "xyz3"
  },
  ...
]

但是,当我运行 xml.marshal() .我收到了 xml: unsupported type: map[string]string .考虑到 XML 需要节点名称等这一事实,这似乎是合理的。所以我基本上要寻找的是一种获得方法:

<rootElement>
    <child>
        <key1>val1</key1>
        <key2>val1</key2>
    </child>
    <child>
        <randval3>val1</randval3>
        <randval2>xyz1</randval2>
        <randval1>xyz1</randval1>
    </child>
</rootElement>

但我无法获得与 xml.unmarshal() 兼容的“对象”。

最佳答案

您可以声明一个自定义映射并让它实现 xml.Marshaler界面。

type mymap map[string]string

func (m mymap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
    if err := e.EncodeToken(start); err != nil {
        return err
    }

    for key, val := range m {
        s := xml.StartElement{Name: xml.Name{Local: key}}
        if err := e.EncodeElement(val, s); err != nil {
            return err
        }
    }

    return e.EncodeToken(start.End())
}

type RootElement struct {
    XMLName  xml.Name `xml:"rootElement"`
    Children []mymap  `xml:"child"`
} 

https://play.golang.com/p/0_qA9UUvhKV
func main() {
    root := RootElement{Children: []mymap{
        {"key1": "val1", "key2": "val2"},
        {"randval1": "val1", "randval2": "xyz1", "randval3": "abc3"},
    }}

    data, err := xml.MarshalIndent(root, "", "  ")
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))
}

输出:
<rootElement>
  <child>
    <key2>val2</key2>
    <key1>val1</key1>
  </child>
  <child>
    <randval3>abc3</randval3>
    <randval1>val1</randval1>
    <randval2>xyz1</randval2>
  </child>
</rootElement>

关于arrays - Marshal 一个 JSON Marshal 兼容映射到 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61266933/

相关文章:

c++ - 使用不带对象的类函数

xml - 从多列的表中提取 html 链接

logging - 去哪里记录错误?

Javascript 排序函数错误地更改元素在数组中的位置

Python 数组索引开关 - 发生了什么?

xml - 使用 Groovy XMLParser 访问和更新通过命名空间限定的属性

xml - 如何从命令行漂亮地打印 XML?

go - 从 Golang 映射中读取字符串

go - 在 Go 模板中验证日期

c - 结构数组中的值变成垃圾值