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

我正在尝试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()


繁华开满天机
浏览 202回答 1
1回答

富国沪深

BLUF:显然,如果不打开整个XML文件然后再重写整个XML文件,就不可能做到这一点。1)您不能将属性写回到元素(尽管实际上可以,但是会很困难,费时且不雅致)2)“从物理上讲,如果不重写整个文件,就不可能用较短或较长的文本替换文件中的文本。(唯一的例外是“长度完全相同的文本”和“数据在最后”。 )”这是来自usr2564301的评论,涉及与您有关的一个问题,该问题涉及在不打开整个XML文档的情况下更改元素的属性值。那可能行不通。XML处理不会意识到数据来自文件,因此无法在文件中完全相同的位置“回写”更改后的值。即使可以:在没有重写整个文件的情况下,用较短或较长的文本替换文件中的文本在物理上也是不可能的。(唯一的例外是“长度完全相同的文本”和“数据在最后”。)– usr2564301
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python