本文通過例項講解 Python 中 xml.etree.ElementTree是如何讀寫,查詢,修改,刪除xml檔案內容的。
以下例子基於如下xml 檔案的內容
1 <user> 2 <name title="xml example">It is an xml example</name> 3 <article name="My article"> 4 <algorithm name="a1"> 5 <interval name="n1">1000</interval> 6 </algorithm> 7 </article> 8 <article name="Your article"> 9 <algorithm name="a2"> 10 <interval name="n2">1001</interval> 11 </algorithm> 12 </article> 13 <profile> 14 <profile-name>profile_hard_easy</profile-name> 15 <level> 16 <level-value>1</level-value> 17 <level-type>hard</level-type> 18 </level> 19 <level> 20 <level-value>2</level-value> 21 <level-type>easy</level-type> 22 </level> 23 </profile> 24 </user>
xml.etree.ElementTree
Python 標準庫中,提供了6種可以用於處理XML的包,本文舉例項說明第6種 1.xml.dom 2.xml.dom.minidom 3.xml.dom.pulldom 4.xml.sax 5.xml.parse.expat 6.xml.etree.ElementTree(簡稱ET)
ET讀取xml檔案
ET提供了兩個物件ElementTree將整個XML文件轉化為樹, Element則代表著樹上的單個節點。對整個XML文件的互動(讀取,寫入,查詢需要的元素)
一般是在 ElementTree層面進行的。對單個XML元素及其子元素,則是在 Element層面進行的。
1 #獲取當前檔案所在目錄 2 print(os.path.dirname(__file__)) 3 #路徑拼接,得到xml 檔案的路徑 4 dirpath = os.path.join(os.path.dirname(__file__),"test2.xml") 5 6 #用ET.ElementTree 讀取xml檔案,將xml檔案解析為tree 10 tree = ET.ElementTree(file=dirpath) 11 #獲取xml 檔案的根結點 12 root = tree.getroot() 13 #xml 的根結點是一個Element 物件. 14 ''' 15 Element 物件常用的屬性有: 16 Element.tag --輸出標籤的名稱 17 Element.text --輸出標籤包含的內容 18 Element.attrib --標籤的屬性 19 ''' 20 print(root) #輸出: <Element 'user' at 0x000001C02A2DB818> 21 #檢視xml根結點root的屬性 22 print(root.tag,root.attrib) #輸出: user {}, 根結點沒有屬性
查詢xml元素
方法一:可以通過遞迴方式,遍歷根結點的所有子元素,獲取數中所有的元素
方法二:使用ElementTree iter() 方法遍歷 tree的所有元素
方法三: 通過XPath 查詢元素
1 #方法一:可以通過遞迴方式,遍歷根結點的所有子元素,獲取數中所有的元素 2 for child_root in root: 3 print(child_root.tag,child_root.text,child_root.attrib) 4 ''' 5 輸出: 6 name 7 {} 8 article 9 {'name': 'My article'} 10 profile 11 {} 12 ''' 13 #根據索引訪問特定的子元素 14 print(root[1].tag,root[1].text,root[1].attrib) 15 ''' 16 輸出: 17 article 18 {'name': 'My article'} 19 ''' 20 21 #方法二:使用ElementTree iter() 方法遍歷 tree的所有元素 22 for elem in root.iter(): 23 print(elem.tag,elem.attrib) 24 if elem.tag == "profile": 25 print("=========Find it, I can do what I want") 26 27 #使用ElementTree iter() 方法,遍歷指定tag的元素,找到自己感興趣的屬性 28 29 for sub_elem in root.iter(tag="article"): 30 print(sub_elem.tag,sub_elem.attrib) 31 32 #方法三: 通過XPath 查詢元素 33 34 ''' 35 ElementTree 物件常用到的方法如下,它們的相同點是接收Xpath路徑作為引數,不同點是 36 1. find 返回第一個匹配的子元素 37 2. findall 以列表的形式返回所有匹配的子元素 38 3. iterfind 則返回一個所有匹配元素的迭代器(iterator) 39 40 Xpath 使用例子: 41 1. 返回所有tag為article的元素: 42 findall("article") 43 2. 返回 tag為article下之下所有tag為algorithm的元素,注意格式必須為 父節點/一代子節點,而不能為父節點/二代子節點,比如article/interval 就會找不到 44 findall(article/algorithm) 45 46 ''' 47 ''' 48 1. find 輸出: 49 algorithm 50 {} 51 ''' 52 for elem in root.find("article"): 53 print(elem.tag,elem.text,elem.attrib) 54 55 ''' 56 2. findall 和 iterfind 輸出: 57 article 58 {'name': 'My article'} 59 article 60 {'name': 'Your article'} 61 ''' 62 for elem in root.findall("article"): 63 print(elem.tag,elem.text,elem.attrib) 64 65 for elem in root.findall("article"): 66 print(elem.tag,elem.text,elem.attrib)
生成和更改xml檔案
1 ''' 2 ElementTree物件的write方法可以往xml寫入內容 3 ''' 4 #為根節點的第一個子元素增加屬性 color=red 5 print(root[0].tag,root[0].attrib) #name {'title': 'xml example'} 6 root[0].set("color","red") 7 print(root[0].tag,root[0].attrib) #name {'title': 'xml example', 'color': 'red'} 8 9 #刪掉根節點的其中一個子元素 10 i=0 11 for item in root: 12 print(i,item.tag) 13 i=i+1 14 del root[4] #刪掉最後一個子元素 foot 15 i=0 16 for item in root: 17 print(i,item.tag) 18 i=i+1 19 20 #將修改後的檔案寫入到一個新的檔案 test3.xml,新文件的元素屬性順序與原文件不同。 21 # 這是因為ET是以字典的形式儲存屬性的,而字典是一個無序的資料結構。同時 XML也不關注屬性的順序,故亂序的影響不大 22 tree.write(os.path.join(os.path.dirname(__file__),"test3.xml"))
構建一個新的xml檔案
1 #生成根元素 2 root=ET.Element("root") 3 #生成子元素 A 4 a=ET.Element("A") 5 #增加元素A的子元素 child1 6 a_child=ET.SubElement(a,"child1") 7 a_child.text="I'm child of A" 8 #增加元素A的子元素 child2 9 a_child1=ET.SubElement(a,"child2") 10 #生成子元素B 11 b=ET.Element("B") 12 #增加元素B的子元素child1 13 b_child=ET.SubElement(b,"child1") 14 b_child.text="I'm child of B" 15 b_child.set("name","book") #set() 接收的是 key,value 形式 16 17 #將a和b 組成一個元組傳入extend()方法中,元素 A和B作為根元素的子元素 18 root.extend((a,b)) 19 trees=ET.ElementTree(root) 20 #將trees 寫入到檔案 test4.xml, 內容為 <root><A><child1>I'm child of A</child1><child2 /></A><B><child1 name="book">I'm child of B</child1></B></root> 21 trees.write(os.path.join(os.path.dirname(__file__),"test4.xml"))