更新中..
簡介
xml.etree.ElementTree
實現了一個簡潔有效的用於解析和新建XML資料的API。其也被簡稱為ET
。
棄用: xml.etree.cElementTree
自Python==3.3已被棄用
警告:使用時需注意惡意構建的資料,請防範XML漏洞
概念
XML 是一種繼承性的分層資料格式,常用樹來表示。
ET
有兩個類,ElementTree 和 Element.
通常將ElementTree對應整個XML,而Element則對應單個XML元素。
注: 本文一般將'element'翻譯為“元素”。
解析XML
假設如下虛構的資料被儲存在目錄 country_data.xml
下。
<?xml version="1.0"?>
<data>
<country name="列支敦斯登">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="奧地利" direction="E"/>
<neighbor name="瑞士" direction="W"/>
</country>
<country name="新加坡">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="馬來西亞" direction="N"/>
</country>
<country name="巴拿馬">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="哥斯大黎加" direction="W"/>
<neighbor name="哥倫比亞" direction="E"/>
</country>
</data>
將該XML使用ET解析的方法有兩種,從檔案直接匯入和從字串解析。
a. 從檔案匯入
import xml.etree.ElementTree as ET
tree = ET.parse('country_data.xml')
root = tree.getroot()
可以看到,tree與root分別是ElementTree和Element
b. 從字串匯入
假設該虛擬資料已被匯入計算機記憶體,儲存在名為data_str
的字串變數中,則
import xml.etree.ElementTree as ET
root = ET.fromstring(data_str)
可以看到,由字串解析得到的直接就是Element物件
Element類
tag
字串,表示該Element的型別
text 與 tail
text
可以理解為該元素起始標籤之後跟隨的非標籤內容
tail
可以理解為該元素結束標籤之後跟隨的非標籤內容
例如
<a><b>1<c>2<d/>3</c></b>4</a>
元素 i | <i> 後續內容 即text |
</i> 後續內容 即tail |
---|---|---|
a | 無 | 無 |
b | "1" | "4" |
c | "2" | 無 |
d | 無 | "3" |
attrib
字典,包含了該元素的屬性
attribStringExample = ' <neighbor name="奧地利" direction="E"/> '
ele1 = ET.fromstring(attribStringExample)
print(ele1.attrib)
輸出{'name': '奧地利', 'direction': 'E'}
get(key, default=None)
從attrib字典中根據key獲取值,若未找到則返回default指定的值
v = ele1.get(key, default=None)
# 相當於:
v = ele1.attrib[key] if key in ele1.attrib.keys() else default
items() 與 keys()
從atrrib字典獲取鍵值對、鍵
set(key, value)
設定元素屬性
相當於
ele1.attrib[key]=value
find(match, namespaces=None), findall(match, namespaces=None), findtext(match, default=None, namespaces=None)
分別為
- 查詢以當前元素為父元素(父節點)的所有子元素(子節點)中與match匹配的第一個子元素,match可以是tag名稱或者path
- 查詢出所有匹配的結果,其他同上
- 返回第一個匹配的子元素的text,其他同find()