python修改xml文件標籤的屬性值

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章