为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

繁华开满天机 2021-03-28 16:14:18
我正在尝试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


查看完整回答
反对 回复 2021-04-09
  • 1 回答
  • 0 关注
  • 201 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信