代码之家  ›  专栏  ›  技术社区  ›  user_78361084

如何实现自定义结构标记并能够对映射进行XML编码?

go
  •  0
  • user_78361084  · 技术社区  · 6 年前

    我有以下资料:

    https://play.golang.org/p/ADX6H-bh0CU

    package main
    
    import (
        "encoding/xml"
        "fmt"
    )
    
    type xmlMap map[string]string
    
    type xmlMapEntry struct {
        XMLName xml.Name
        Value   string `xml:",chardata"`
    }
    
    func (m xmlMap) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
        if len(m) == 0 {
            return nil
        }
    
        err := e.EncodeToken(start)
        if err != nil {
            return err
        }
    
        for k, v := range m {
            e.Encode(xmlMapEntry{XMLName: xml.Name{Local: k}, Value: v})
        }
    
        return e.EncodeToken(start.End())
    }
    
    func main() {
        type Family struct {
            Siblings map[string]string
        }
    
        type MyFamily struct {
            Siblings xmlMap `json:"siblings" xml:"siblings"`
        } 
    
        // In reality, "f" comes from a function in an outside package...e.g. "f := somepackage.Function()"
        f := &Family{
            Siblings: map[string]string{"bob": "brother", "mary": "sister"},
        }
    
        var m = &MyFamily{}
        *m = MyFamily(*f)
    
        x, err := xml.Marshal(m)
        if err != nil {
            panic(err)
        }
        fmt.Println(string(x))
    }
    

    族结构来自外部包。我创建MyFamily结构是为了添加json和xml标记。如果我尝试对MyFamily进行xml编码,则会出现错误:

    xml: unsupported type: map[string]string
    

    通过实现我已经完成的定制XML封送器,可以很容易地解决这个问题。

    这就产生了一个单独的问题。我试图简化这个例子,但“f”来自外部包中的函数……例如f:=somepackage.Function()。当我尝试将f化名为m时,会出现以下错误:

    cannot convert *f (type Family) to type MyFamily
    

    之所以会出现这种情况,是因为Family有一个map[string]字符串,而MyFamily有一个xmlMap。即使它们是相同的底层类型,我也会得到那个错误。

    这是一个简单的例子,可以通过

    var m = &MyFamily{Siblings: f.Siblings} 
    

    0 回复  |  直到 6 年前