我们需要使用Go解析一个巨大的XML文件。我们希望使用xml.NewDecoder()
和decoder.Token()
库调用来使用类似SAX的基于事件的算法。我们使用XML注释创建了适当的结构类型。到目前为止,一切都很轻松。
现在,我们浏览文件并检测xml.StartElement
令牌。这就是问题所在。我们只需解码此起始令牌的属性并继续其内容。如果我们调用token.DecodeElement()
,我们的方案中将“解码”或跳过整个内容。
如何仅解码特定StartElement
的属性并继续到元素的主体?
答案 0 :(得分:2)
我使用普通的struct / reflect解码在go-wikiparse中解析wikipedia xml转储(~50GB xml文件)。这很简单。
策略基本上是这样的:
首先,阅读信封标记:
d := xml.NewDecoder(r)
_, err := d.Token()
if err != nil {
return nil, err
}
例如,<someDocument><billions-of-other-things/></someDocument>
会给你一些文档。
然后,你可以在循环中构造解码下一个东西:
var i item
d.Decode(&i)
内存不多,而且解析起来非常容易。