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 了