当XML元素在for
循环中被ET.interparse()
时,我正在尝试写它的新属性值。关于如何做到这一点的建议?
我希望避免打开整个XML文件,因为它非常大,这就是我一次只在start事件中打开单个元素的原因。
下面是我的代码:
import xml.etree.cElementTree as ET
def 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()
发布于 2018-06-29 06:03:02
BLUF:显然,如果不打开整个XML文件,然后重写整个XML文件,就不可能做到这一点。
1)您不能将属性写回元素(虽然您实际上可以这样做,但这将是困难、耗时和不优雅的)
2)“在不重写整个文件的情况下,用更短或更长的文本替换文件中的文本在物理上是不可能的。(唯一的例外是”完全相同的文本长度“和”数据在最后“。)
下面是usr2564301对您提出的关于在不打开整个XML文档的情况下更改元素属性值的问题的评论。
不可能工作的
。XML处理不知道数据来自文件,因此它不能在文件中完全相同的位置“写回”更改后的值。即使它可以:在不重写整个文件的情况下,用更短或更长的文本替换文件中的文本在物理上是不可能的。(唯一的例外是“文本长度完全相同”和“数据在最后”。)- usr2564301
https://stackoverflow.com/questions/50954387
复制相似问题