Python xml.etree.ElementTree讀寫xml檔案例項

遐靜草發表於2021-06-13

  本文通過例項講解 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"))

 

相關文章