我有大型(500 MB - 2 GB)XML文件,我目前使用iterparse
线性处理。一般结构是很多具有相同结构的记录,我只想分析一小部分。我今天的方法是在我去的时候解析并保留我感兴趣的那些(一旦被解析)。这很有效,但速度很慢。
由于各种原因(主要是好奇心),我想重写解析以提取符合我的“记录”(一组特定标签)定义的XML块,并检查块(作为字符串)是否包含一个特定的子串,使记录有趣。这些块将排队等待进一步处理。
The solutions to a similar question都使用基于DOM的方法,这些方法不适合我的大文件。
是否有一个现有的模块/方法可以采用边界标记并以线性方式吐出由它分隔的XML集团,类似xpath
中的lxml.etree.parse
方法?
答案 0 :(得分:0)
如果不知道哪些标准会定义您感兴趣的节点,我就无能为力。但是,无论如何,我可以尝试回答部分问题。
这应该返回RecordTag或OtherTag的所有元素的列表。
records = etree.parse(file).xpath(".//*[self::RecordTag or self:OtherTag]")
如果你只关心一种类型的元素,那么这个xpath查询就比较简单,并且可能比上面提供更好的性能,它会对树中的每个元素执行自我轴检查。
xpath(".//Record")
如果您感兴趣的记录的标准比标记更复杂,那么我需要更多细节来帮助构建一个xpath。