我们需要使用 Go 解析一个巨大的 XML 文件。我们想使用基于 xml.NewDecoder()
和 decoder.Token()
库调用的类似 SAX 事件的算法。我们已经使用 XML 注释创建了适当的结构类型。到目前为止一切都很容易。
现在,我们遍历文件并检测 xml.StartElement
标记。问题来了。我们只需要解码此起始 token 的属性并继续进入其内容。如果我们调用 token.DecodeElement()
,整个内容在我们的场景中被“解码”或跳过。
如何只解码特定 StartElement
的属性并继续到元素的主体?
最佳答案
我在 go-wikiparse 中解析维基百科 xml 转储(~50GB xml 文件)使用普通结构/反射解码。非常简单。
策略基本上是这样的:
首先,读取信封 token :
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)
RAM 不多,解析起来 super 容易。
关于xml - 使用 Go 解析巨大的 XML 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26756382/