通过python中的XML.osm更改ET.iterpase()时的attrib值

时间:2018-06-20 17:56:47

标签: python xml

我正在尝试在ET.interparse()循环中for编写XML元素的新属性值。有关如何执行此操作的建议?

我想避免打开整个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()

1 个答案:

答案 0 :(得分:0)

BLUF:显然,如果不打开整个XML文件然后再重写整个XML文件,就不可能做到这一点。

1)您不能将属性写回到元素(尽管实际上可以,但是会很困难,耗时且不雅致)

2)“在物理上,不可能在不重写整个文件的情况下用较短或较长的文本替换文件中的文本。(唯一的例外是“长度完全相同的文本”,并且“数据位于结束”。)”

这是usr2564301关于与您有关的一个问题的评论,该问题涉及在不打开整个XML文档的情况下更改元素的属性值。

  

那可能行不通。 XML处理不知道数据来自文件,因此无法在文件中完全相同的位置“回写”更改后的值。即使可以:在没有重写整个文件的情况下,用较短或较长的文本替换文件中的文本在物理上也是不可能的。 (唯一的例外是“长度完全相同的文本”和“数据在最后”。)– usr2564301