我正在尝试ET.interparse()在for循环中编写XML元素的新属性值。有关如何执行此操作的建议?我想避免打开整个XML文件,因为它很大,这就是为什么我一次只在start事件中打开一个元素的原因。这是我的代码:import xml.etree.cElementTree as ETdef main_function: osmfile = 'sample.osm' osm_file = open(osmfile, 'r+') for event, elem in ET.interparse(osm_file, events=('start',)): if elem.tag == 'node': for tag in elem.iter('tag'): if is_addr_street_tag(tag): # Function returns boolean cleaned_street_name = cleaning_street(tag.attrib['v']) # Function returns cleaned street name ##===================================================## ## Write cleaned_street_name to XML tag attrib value ## ##===================================================## osm_file.close()
1 回答
富国沪深
TA贡献1790条经验 获得超9个赞
BLUF:显然,如果不打开整个XML文件然后再重写整个XML文件,就不可能做到这一点。
1)您不能将属性写回到元素(尽管实际上可以,但是会很困难,费时且不雅致)
2)“从物理上讲,如果不重写整个文件,就不可能用较短或较长的文本替换文件中的文本。(唯一的例外是“长度完全相同的文本”和“数据在最后”。 )”
这是来自usr2564301的评论,涉及与您有关的一个问题,该问题涉及在不打开整个XML文档的情况下更改元素的属性值。
那可能行不通。XML处理不会意识到数据来自文件,因此无法在文件中完全相同的位置“回写”更改后的值。即使可以:在没有重写整个文件的情况下,用较短或较长的文本替换文件中的文本在物理上也是不可能的。(唯一的例外是“长度完全相同的文本”和“数据在最后”。)– usr2564301
添加回答
举报
0/150
提交
取消