使用Go解析巨大的XML文件
问题描述:
我们需要使用Go解析巨大的XML文件。我们希望使用类似SAX的基于事件的算法,使用xml.NewDecoder()
和decoder.Token()
库调用。我们用XML注释创建了适当的结构类型。一切都很容易到目前为止。使用Go解析巨大的XML文件
现在,我们通过该文件并检测xml.StartElement
令牌。问题来了。我们只需要解码这个起始令牌的属性并继续到它的内容。如果我们拨打token.DecodeElement()
,则整个内容将在我们的场景中“解码”或跳过。
如何仅解码特定StartElement
的属性并继续到元素的正文?
答
我使用普通结构/反射解码解析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
根本不需要'token.DecodeElement()'。只需继续使用'for {token,_:= dec.Token();开关x:=标记。(类型){...}}循环。 – topskip 2014-11-05 12:17:43
但是如何解析属性?我们不希望像'x:= token.Attr [3] .Value' ... – eeq 2014-11-05 12:30:25
为什么不呢?这就是我所做的:'for _,v:= range x.Attr {...}'它对我来说足够好用了。 – topskip 2014-11-05 12:51:30