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