首先需要说明的是,直接修改一个xml文件是不太现实的,我们能做的是将xml文件中的所有文本读出来,修改文本的内容之后将其写入到一个新的文件中,只是多了一步写入的过程,其实也挺简单的。
python读写xml有两个包,一个是xml.dom.minidom,一个是xml.etree.ElementTree,但是前者我实在没找到实现方法,所以用的时是后者。
这里要非常感谢:/insane-Mr-Li/p/9963875.html,对于xml.etree.ElementTree的功能写得非常详细
1、修改的目标
<osm>...<way>...<tag k="highway" v="living_street" /><tag k="name" v="广州环城高速六车道" />...</way>...</osm>
目标是根据第二个tag标签里面的v的车道数,修改第一个tag标签中的v的值
2、代码
import xml.etree.ElementTree as xeelaneDict = {'双车道': 'trunk1', '四车道': 'trunk2','六车道': 'trunk3','八车道': 'trunk4'}def laneChange():# 读取文件domTree = xee.parse("highwaySingleDirectUpout.osm.xml")# 获得所有节点内容root = domTree.getroot()# 获得所有标签是"way"的节点内容ways = root.findall("way")# 逐个修改for way in ways:# 获得所有标签是"tag"的节点内容laneTag = way.findall("tag")# 获取车道数信息,因为我的一个way中的tag节点只有两个# 这里获取的是第二个tag中的属性"v"内容的最后三个字,例如“双车道”、“四车道”等lanStr = laneTag[1].get("v")[-3:]# 这里重新设置节点的属性内容# 我是需要重设第一个tag节点中属性"v"的内容,修改为"trunk1"、"trunk2"等laneTag[0].set("v",laneDict[lanStr])# print(laneTag[0].get("v"))# 修改完成之后写入到新的xml文件中,这里与minidom有些不同的是:用到的是domTree而不是root# 因为有汉字,所以编码设置为utf8,防止乱码domTree.write("highway.osm.xml",encoding="utf8")if __name__=="__main__":laneChange()