语言: - Python 2.7.6
文件大小: - 1.5 GB
XML格式
<myfeed>
<product>
<id>876543</id>
<name>ABC</name>
....
</product>
<product>
<id>876567</id>
<name>DEF</name>
....
</product>
<product>
<id>986543</id>
<name>XYZ</name>
....
</product>
我必须
A)读取所有节点<product>
B)删除其中一些节点(如果<id>
属性的文本是python set()
C)更新/更改几个节点(如果<id>
属性的文本在python dict中
D)追加/写一些新节点
问题是我的XML文件很大(大约1.5 GB)。我做了一些研究并决定将lxml用于所有这些目的。
我正在尝试使用iterparse()和element.clear()来实现这一点,因为它不会占用我所有的内存。
for event, element in etree.iterparse(big_xml_file,tag = 'product'):
for child in element:
if child.tag == unique_tag:
if child.text in products_id_hash_set_to_delete: #python set()
#delete this element node
else:
if child.text in products_dict_to_update:
#update this element node
else:
print child.text
element.clear()
注意: - 我希望在XML文件的一次扫描中实现所有这4项任务
问题
1)我可以在一次扫描文件中实现所有这些吗?
2)如果是,如何删除和更新我正在处理的元素节点?
3)我应该使用tree.xpath()吗?如果是,它将为1.5 GB文件消耗多少内存,或者它的工作方式与iterparse()
相同我在python方面不是很有经验。我来自Java背景。
答案 0 :(得分:2)
您无法就地编辑XML文件。您必须将输出写入新的(临时)文件,然后用新文件替换原始文件。
所以基本算法是:
回答补充问题:您需要意识到XML文件是一个(长)字符串。如果你想插入一个角色,你必须将所有其他角色洗牌;如果你想删除一个角色,你必须将所有其他角色混乱。你不能用文件做到这一点;你不能只从文件中间删除一个字符。
如果你有数百万个元素(这是一个真正的问题,而不是一个类的练习),那么你需要使用一个数据库。当有人说“数据库”时,SQLite是我的第一个想法,但正如Charles Duffy在下面指出的那样,如果已经拥有XML,XQuery数据库可能是一个更好的起点。有关一些开源实现,请参阅BaseX或eXist。