使用Go解析大型XML文件

3
我们需要使用Go语言解析一个大型XML文件。我们想要使用类似SAX的基于事件的算法,使用xml.NewDecoder()decoder.Token()库调用。我们已经创建了适当的带有XML注释的结构类型。到目前为止,一切都很简单。
现在,我们遍历文件并检测xml.StartElement标记。这里出现了问题。我们需要仅解码此起始标记的属性并继续进入其内容。如果我们调用token.DecodeElement(),则在我们的情况下将“解码”或跳过整个内容。
如何仅解码特定StartElement的属性并继续元素的正文?

2
你根本不需要使用 token.DecodeElement()。只需继续使用 for { token, _ := dec.Token(); switch x := token.(type) { ...} } 循环即可。 - topskip
但是如何解析属性呢?我们不想要像 x := token.Attr[3].Value 这样的东西... - eeq
1
为什么不呢?这是我的做法:for _, v := range x.Attr {...},对我来说已经足够好了。 - topskip
@topskip好的,我在想是否有更好的"魔法"和更符合习惯的解决方案。但是既然可以这么做,谢谢你。 - eeq
1个回答

2
我使用纯结构/反射解码在go-wikiparse中解析维基百科XML转储(~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)

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


完美,达斯汀,我完全忽视了“Decode()”。 - eeq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接