使用Go解析大型XML文件

时间:2014-11-05 11:41:23

标签: xml go sax

我们需要使用Go解析一个巨大的XML文件。我们希望使用xml.NewDecoder()decoder.Token()库调用来使用类似SAX的基于事件的算法。我们使用XML注释创建了适当的结构类型。到目前为止,一切都很轻松。

现在,我们浏览文件并检测xml.StartElement令牌。这就是问题所在。我们只需解码此起始令牌的属性并继续其内容。如果我们调用token.DecodeElement(),我们的方案中将“解码”或跳过整个内容。

如何仅解码特定StartElement的属性并继续到元素的主体?

1 个答案:

答案 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)

内存不多,而且解析起来非常容易。