首先需要说明的是,直接修改一个xml文件是不太现实的,我们能做的是将xml文件中的所有文本读出来,修改文本的内容之后将其写入到一个新的文件中,只是多了一步写入的过程,其实也挺简单的。
python读写xml有两个包,一个是xml.dom.minidom,一个是xml.etree.ElementTree,但是前者我实在没找到实现方法,所以用的时是后者。
这里要非常感谢:https://www.cnblogs.com/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 xee
laneDict = {'双车道': '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()