0

我正在尝试ET.interparse()for循环中编写 XML 元素的新属性值。关于如何做到这一点的建议?

我想避免打开整个 XML 文件,因为它非常大,这就是为什么我一次只在开始事件中打开一个元素。

这是我的代码:

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()
4

1 回答 1

0

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

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

2)“在不重写整个文件的情况下,用更短或更长的文本替换文件中的文本在物理上是不可能的。(唯一的例外是“完全相同长度的文本”和“数据在最后”。 )"

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

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

于 2018-06-28T22:03:01.653 回答