首先需要說明的是,直接修改一個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()