将JSON与Marshal兼容的映射封送至XML [英] Marshal a JSON Marshal compatible map to XML

查看:105
本文介绍了将JSON与Marshal兼容的映射封送至XML的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

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

Populating the results in a json.marshal() compatible object. Outputing:

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

但是,当我运行 xml.marshal()时.我收到 xml:不支持的类型:map [string] string .考虑到XML需要节点名等事实,这似乎是合理的.因此,我基本上要寻找的是一种获取方法:

However, when I run xml.marshal(). I receive a xml: unsupported type: map[string]string. Which seems reasonable given the fact that XML needs node names etc. So what I'm basically looking for is a way to get:

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

但是我一直无法获得与 xml.unmarshal()

But I'm getting stuck with getting an 'object' compatible with xml.unmarshal()

推荐答案

您可以声明一个自定义映射,并使其实现 xml.Marshaler 接口.

You could declare a custom map and have it implement the xml.Marshaler interface.

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>

这篇关于将JSON与Marshal兼容的映射封送至XML的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆