用python进行XML增量解析
我正试图用下面的代码解析一个巨大的XML文件,每当我通过终端运行代码时,它都会在没有任何错误的情况下运行,并且什么也不做。我需要它以增量方式解析文件,并在检查提交时间是否早于特定天数后删除父元素 例如,XML结构如下所示:用python进行XML增量解析,python,xml,elementtree,Python,Xml,Elementtree,我正试图用下面的代码解析一个巨大的XML文件,每当我通过终端运行代码时,它都会在没有任何错误的情况下运行,并且什么也不做。我需要它以增量方式解析文件,并在检查提交时间是否早于特定天数后删除父元素 例如,XML结构如下所示: <Feed> <Reviews> <Review> <SubmissionTime>2015-06-16T19:00:00.000-05:00</SubmissionTime> </Review> <
<Feed>
<Reviews>
<Review>
<SubmissionTime>2015-06-16T19:00:00.000-05:00</SubmissionTime>
</Review>
</Reviews
</Feed>
2015-06-16T19:00:00.000-05:00
增量处理大型XML文件的方法是使用。
您需要扩展xml.sax.ContentHandler
并在其中添加逻辑。
看一个例子这可能是一个评论而不是一个答案。在SAX内容处理程序中实现逻辑?我认为上面的答案是一个答案,因为它指向OP到一个明确的方向。这并不回答OP的主要问题:每当我通过终端运行代码时,它只是运行没有任何错误,什么也不做。从技术上讲,您建议使用不同的库来处理庞大的XML。
from lxml import etree, objectify
import logging, sys, iso8601
from datetime import datetime, timedelta
from dateutil.relativedelta import relativedelta
import re
def remove_per_age(file):
datestring = datetime.now().strftime("%Y%m%d-%H%M%S")
full_data = ""
for event, elem in ET.iterparse(sys.argv[1], events=("end",)):
if elem.tag == 'SubmissionTime':
element_datetime = iso8601.parse_date(elem.text)
element_date = element_datetime.date()
if (element_date < datetime.now(element_datetime.tzinfo).date()-relativedelta(days=180)):
elem.getparent().remove(elem)
else:
full_data += ET.tostring(elem)
else:
elem.clear()
with open("output.xml", 'w') as f:
f.write(full_data)
def strip_tag_name(tag):
pattern = re.compile(r'\{.+\}')
clean_tag = pattern.sub(r'', tag)
return clean_tag
if __name__ == "__main__":
remove_per_age(sys.argv[1])
#Reviews/Review/SubmissionTime