程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式師世界 >> 編程語言 >  >> 更多編程語言 >> Python

python學習筆記:解析XML(the ElementTree XML API)

編輯:Python

python提供處理(解析和創建)XML格式文件的接口:xml.etree.ElementTree(以下簡稱ET) 模塊。

> 注:自version3.3後,xml.etree.cElementTree模塊廢棄。

一、XML格式

XML是一種層級數據格式,通常可以用“樹”表示。ET中有兩個類(class)可對XML進行表示:

  1.  ElementTree:將整個XML文件表示成“樹”;(class ET.ElementTree)
  2. Element:表示這棵樹中的單個節點。(class ET.Element)

二、解析XML

下文以解析 country_data.xml 文件為例:

<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>

2.1  讀取XML格式文件

    2.1.1 讀取方法

  (1)方法一:來自文件

import xml.etree.ElementTree as ET
#方法1:來自文件
tree = ET.parse('XXXX.xml') #文件存儲路徑,獲取整個xml
root = tree.getroot() #獲取xml的根節點

    (2) 方法二:來自文件內容(字符串)

#方法2:來自字符串
root = ET.fromstring('XXXX.xml文件的全部字符串')

       說明:ET.fromstring() 函數將XML文件內容(字符串格式)直接解析為一個Element對象(節點),這個Element是這個被解析的XML樹的根節點。

   2.1.2 代碼

import xml.etree.ElementTree as ET
filePath = 'C:\codes\data\country_data.xml'
##method1: reading from a file
tree = ET.parse(filePath)
root = tree.getroot()
print(root.tag)
##method2: importing from a string
root2 = ET.fromstring('''<?xml version="1.0"?>
<data>
<country name="Liechtenstein">
<rank>1</rank>
<year>2008</year>
<gdppc>141100</gdppc>
<neighbor name="Austria" direction="E"/>
<neighbor name="Switzerland" direction="W"/>
</country>
<country name="Singapore">
<rank>4</rank>
<year>2011</year>
<gdppc>59900</gdppc>
<neighbor name="Malaysia" direction="N"/>
</country>
<country name="Panama">
<rank>68</rank>
<year>2011</year>
<gdppc>13600</gdppc>
<neighbor name="Costa Rica" direction="W"/>
<neighbor name="Colombia" direction="E"/>
</country>
</data>''')
print (root2.tag)

        輸出:

 2.2 獲取Element對象屬性

序號屬性表示數據類型舉例1Element.tagelement name,指該element對象的類型字符串

輸入:root.tag

輸出:data

2Element.attribelement atrribute's name and value字典

輸入:root[0].attrib

輸出:{‘name’:'Liechtenstein'}

3Element.textthe text between the element's start tag and its first child or end tag, or None.(當前element起始tag與下一個鄰近tag之間的文本)通常為字符串

輸入:root[0][0].text 

輸出:1

4Element.tailthe text between the element's end tag and the next tag, or None.(當前element結束tag與下一個tag之間的文本)通常為字符串

輸入:root[0][0].tail

輸出:None

5Element.keys()獲取當前對象/節點屬性的鍵,返回列表list

輸入:root[0].keys()

輸出:['name']

6Element.items()獲取當前對象/節點屬性鍵值對,返回列表list[(,)]

輸入:root[0][3].items()

輸出:[('name', 'Austria'), ('direction', 'E')]

 2.3 查詢subElement對象的函數

2.3.1查找范圍為當前Element對象及以下所有層級

        迭代器查找:Element.iter('tagname')

  • 查詢當前element對象及以下所有層級tag為tagname的對象(深度優先查找);
  • 若tagname為 None 或 ' * ',則查找當前element對象及以下所有層級的所有對象。
#獲取當前element對象下所有層級tag為Neighbor的對象
for neighbor in root.iter('neighbor'):
print(neighbor.attrib) 

         輸出:

2.3.2 查找范圍為當前Element對象下一層級

  • Element.findall(match):獲取當前Element對象下一層級(僅這一層)匹配的對象列表。
  • Element.iterfind(match):獲取當前Element對象下一層級(僅這一層)匹配的對象迭代器。
  • Element.find(match):獲取當前Element對象下一層級中第一個匹配的對象。
  • Element.findtext(match, default=None):獲取當前Element對象下一層級中第一個匹配的對象的text(不好用,會出現很多'\n(空格)')。
#查找當前element對象下一層級
print('Using element.findall:')
ele1 = root.findall('country')
for every in ele1:
print(every.attrib)
print("Using element.iterfind:")
for every in root.iterfind('country'):
print(every.attrib)
print('Using element.itertext:')
for every in root.itertext():
if every.startswith('\n')==False:
print(every)
#查找當前element對象下一層級第一個匹配對象
print('Using element.find:')
ele = root.find('country')
print(ele.attrib)
print('Using element.findtext:')
ranktext = ele.findtext('rank')
print(ranktext)

輸出:

 


  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式師世界 All Rights Reserved