xml - 使用 Go 解析巨大的 XML 文件

标签 xml go sax

我们需要使用 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/

相关文章:

XML SAX 处理程序中逻辑的 Java 帮助

python - 在两个 Python 脚本中将文件作为参数传递

java - java中从URL解析XML

for-loop - 有没有一种方法可以将 for 循环作为 go 例程运行而无需将其放在单独的 func 中

go - 所有 go routines 都睡着了 - 死锁

go - 如何简单测试文件的下载和上传?

java - SAX 解析后在 ListView 中显示数据

javascript - 音隙视频 "Failed to load because no supported source was found"

javascript - 将特殊的 HTML 字符插入 XML

java - 为什么在使用 SaxParser 解析 xml 标记时缺少某些字符?