使用Go解析巨大的XML文件

问题描述:

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

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

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

+2

根本不需要'token.DecodeElement()'。只需继续使用'for {token,_:= dec.Token();开关x:=标记。(类型){...}}循环。 – topskip 2014-11-05 12:17:43

+0

但是如何解析属性?我们不希望像'x:= token.Attr [3] .Value' ... – eeq 2014-11-05 12:30:25

+1

为什么不呢?这就是我所做的:'for _,v:= range x.Attr {...}'它对我来说足够好用了。 – topskip 2014-11-05 12:51:30

我使用普通结构/反射解码解析wikipedia xml在go-wikiparse中转储(〜50GB xml文件)。这非常简单。

的策略基本上是这样的:

首先,阅读信封令牌:

d := xml.NewDecoder(r) 
_, err := d.Token() 
if err != nil { 
    return nil, err 
} 

例如,对于<someDocument><billions-of-other-things/></someDocument>会给你someDocument。

然后,你可以在结构循环解码下一个事情:

var i item 
d.Decode(&i) 

没有太多的RAM,和它的超级容易解析。

+0

完美,达斯汀,我完全忽略了'Decode()'。 – eeq 2014-11-07 09:45:37