xml Unmarshal innerXml及其属性

时间:2015-05-17 10:14:13

标签: go

我想解组innerXml及其属性。我编写了一个Unmarshal函数来实现它,但看起来函数处于无限循环中。错误信息是

runtime: goroutine stack exceeds 1000000000-byte limit 
fatal error: stack overflow

示例是here

我不知道为什么会这样。有人可以帮助我,谢谢。

Update1:​​谢谢Ainar-G。我试过他的榜样。它的作用是将innerXml作为chardata获取,我找不到。如果我将示例更改为this,结果为空,则应包含所有原始xml。

Update2:我找到了解决方案,但可能有点罗嗦。 code

1 个答案:

答案 0 :(得分:2)

UnmarshalXML方法中,您调用xml.(*Decoder).DecodeElement,然后调用UnmarshalXML等。这会创建无限循环。要么创建一个包装器结构,要么只在UnmarshalXML中解组结构的一部分。

编辑:如果要解组节点的所有属性,请参阅this answer中的示例。

工作示例:

func (in *innerXml) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
    in.XMLName = start.Name
    in.Attrs = make(map[string]string)
    for _, attr := range start.Attr {
        in.Attrs[attr.Name.Local] = attr.Value
    }

    err := d.DecodeElement(&in.Value, &start)
    if err != nil {
        return err
    }

    return nil
}

游乐场:http://play.golang.org/p/TLcqFSyn94