在xml unmarshal之后获取root结构

时间:2017-09-15 09:18:43

标签: go unmarshalling

我正在阅读xml文件并自动解组。

我将数据结构定义如下:

type oDoc struct {
    Body      oBody      `xml:"body"`
    AutoStyle oAutoStyle `xml:"automatic-styles"`
}
type oBody struct {
    Spreadsheet oSpread `xml:"spreadsheet"`
}
type oSpread struct {
    Tables []oTable `xml:"table"`
}
type oTable struct {
    Name string `xml:"name,attr"`
    Rows []oRow `xml:"table-row"`
}
type oRow struct {
    Cells []oCell `xml:"table-cell"`
    Style string  `xml:"style-name,attr"`
}

还有更多下来但这对于这个例子并不重要。

从oRow对象,我需要访问根oDoc对象。

这可能吗?我已经看过几个使用接口的例子,但这似乎要求我手动添加每个元素来设置相应的父元素。我不确定我能做到这一点,因为解组是自动的。

编辑:我想要实现的例子。 oDoc分为oTables和oStyles(为简洁起见,不添加样式)。每个oRow都有一个与oStyle对象对应的样式Name。我希望能够创建一个可以执行

的方法
rowOject.getStyleObject()

根据gonutz的建议,我可以做类似

的事情
docObj.getRow(specificRow).getStyle(docObj) 

并使用该docObj深入到我想要的样式,但这就像是糟糕的形式。如果它是唯一/最好的解决方案,我会去寻求它,但似乎应该有更好的方法。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

如果您真的需要,只需添加对文档的反向引用即可。以下是代码所需的更改:

type oRow struct {
    Cells []oCell `xml:"table-cell"`
    Style string  `xml:"style-name,attr"`
    doc   *oDoc // this will not affect the xml parsing
}

func main() {
    var doc oDoc
    // load the oDoc...
    // then add the back-references
    for t := range doc.Body.Spreadsheet.Tables {
        table := &doc.Body.Spreadsheet.Tables[t]
        for i := range table.Rows {
            table.Rows[i].doc = &doc
        }
    }
}