使用Go解析巨大的XML文件

使用Go解析巨大的XML文件,xml,go,sax,Xml,Go,Sax,我们需要使用Go解析一个巨大的XML文件。我们希望使用类似SAX的基于事件的算法,使用xml.NewDecoder()和decoder.Token()库调用。我们已经用XML注释创建了适当的结构类型。到目前为止,一切都很简单 现在,我们遍历该文件并检测xml.StartElement令牌。问题来了。我们只需要解码这个起始标记的属性并继续它的内容。如果我们调用token.DecodeElement(),整个内容在我们的场景中被“解码”或跳过 如何仅解码特定StartElement的属性并继续到元素

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

现在,我们遍历该文件并检测
xml.StartElement
令牌。问题来了。我们只需要解码这个起始标记的属性并继续它的内容。如果我们调用
token.DecodeElement()
,整个内容在我们的场景中被“解码”或跳过


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

我使用普通结构/反射解码解析wikipedia xml转储(~50GB xml文件)。非常简单

战略基本上是这样的:

首先,读取信封令牌:

d := xml.NewDecoder(r)
_, err := d.Token()
if err != nil {
    return nil, err
}
e、 例如,
将为您提供一些文档

然后,您可以对循环中的下一个内容进行结构化解码:

var i item
d.Decode(&i)

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

您根本不需要
token.DecodeElement()
。只需继续{token,{code>的
,开关x:=dec.token();开关x:=token。(键入){…}
循环。但是如何解析属性呢?我们不想要像
x:=token.Attr[3].Value这样的东西,为什么不呢?这就是我所做的:
对于uv,v:=range x.Attr{…}
它对我来说已经足够好了。@topkip好的,我想知道是否有一些“魔法”和更惯用的解决方案。但是为什么不呢,谢谢。太好了,达斯汀,我完全忽略了
Decode()