2014-11-05 140 views
2

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

回答

1

我使用普通結構/反射解碼解析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