一尘不染

Golang中的多类型解码器

go

我有一个XML文档。一些字段具有自定义格式。例:

<document>
  <title>hello world</title>
  <lines>
   line 1
   line 2
   line 3
  </lines>
</document>

我想将其导入如下结构:

type Document struct {
    Title  string   `xml:"title"`
    Lines  []string `xml:"lines"`
}

有什么方法可以实现自定义解码器,它将行字符串拆分成行数组(["line 1", "line 2", "line 3"])?

可以将Lines字段设置为字符串类型,并在xml导入后进行拆分,但这似乎不是一个很好的解决方案。我有什么方法可以定义用于行分割的自定义解码器,并将其与xml解码器组合?


阅读 254

收藏
2020-07-02

共1个答案

一尘不染

您可以通过定义符合xml.Unmarshaler接口的新类型来实现。因此,与其创建Lines一个[]string,而不是使用适当的UnmarshalXML方法声明一个新类型。例如:

type Lines []string

func (l *Lines) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    var content string
    if err := d.DecodeElement(&content, &start); err != nil {
        return err
    }
    *l = strings.Split(content, "\n")
    return nil
}

您可以在此处看到完整的示例:http :
//play.golang.org/p/3SBu3bOGjR

如果您也想支持这种类型的编码,则可以MarshalXML以类似的方式实现该方法(构造所需的字符串内容并将其传递给编码器)。

2020-07-02