python XML 檔案解析

天刚刚破晓發表於2024-04-24

XML 檔案認識

<a xmlns:ns="xxx" attr1="33">
  <ns:b>1
    <c>2
      <d/>3
    </c>
  </ns:b>4
</a>

xml每個節點可以分為

  • tag : a,ns:b,c,d都是tag
  • text : 1,2是text
  • tail : 3,4是tail.3是屬於d的tail,4是ns:b的tail
  • attrib : 必須是鍵值對(key=value),定義在標籤<>中,attr1="33"就是a的attrib

一些特殊的case

  • 名稱空間
    xmlns:ns="xxx" 也符合attrib的定義但是它不是,xmlns是特殊的關鍵字,它定義了名稱空間ns,在後面使用find族函式查詢節點b時需要傳入名稱空間否則找不到,並且b的tag是{xxx}b而不是ns:b. xxx是上面定義的ns的值.
  • <d/> 是自閉合節點相當於是<d></d>的簡寫.

解析XML

瞭解XML結構後解析它就簡單了,主要步驟就是 定位加獲取需要的值(通常是text)
下面是解析XML會用到的一些API

import xml.etree.ElementTree as ET

# 有使用xmlns的需要先獲取namespace
# 可以用這個正規表示式去匹配 xmlns:(\w+) ?= ?"(.*)"

xml_tree = ET.parse(xml_file) #得到xml tree 用於檔案級別的操作
root_elment = xml_tree.getroot()
b_elment = root.findall("ns:b",namespace) #如果沒用xmlns就不要第二個引數
#namespace是用正規表示式匹配到的,類似這樣 {'ns'='xxx'}
#find or findall 只能找到當前節點的下一層,更下層的不會搜尋,find只返回找到的第一個,findall返回所有

b_elment.text #就可以獲取到 1 了

相關文章