我正在阅读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深入到我想要的样式,但这就像是糟糕的形式。如果它是唯一/最好的解决方案,我会去寻求它,但似乎应该有更好的方法。
有什么建议吗?
答案 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
}
}
}