python解析.xml文件-- xmltodict模塊(第三方)


第一part:XML文件介紹


 

1.XML的定義: 指可擴展標記語言(EXtensible Markup Language)。

2.XML的特點:

1)XML 是一種很像HTML的標記語言;
2)XML 的設計宗旨是傳輸數據,而不是顯示數據;
3)XML 標簽沒有被預定義,需要自行定義標簽;
4)XML 被設計為具有自我描述性;
5)XML 是 W3C 的推薦標准。

3.XML的用途:

1)XML把數據從HTML分離;
2)XML簡化數據共享;
3)XML簡化數據傳輸;
4)XML簡化平台變更;
5)XML使您的數據更有用;
6)XML用於創建新的互聯網語言。

4.XML的文件內容結構:

元素:指從開始標簽到結束標簽的部分(均包括開始和結束),一個元素可以包括:子元素,屬性和文本。

子元素
<people>
<name></name>
</people>
屬性
<sex=’男’></sex>
文本
<age>12</age>


5.XML語法規則:

1)所有的元素都必須有開始標簽和結束標簽,省略結束標簽是非法的;
2)大小寫敏感,(比如:<people></people>和<People></People>是兩個不同的標簽;
3)xml文檔必須有根元素;
4)XML必須正確嵌套,父元素必須完全包住子元素;
5)XML屬性值必須加引號,元素的屬性值都是一個鍵值對形式。

 

第二part:Python對XML的解析的方法



常見的XML編程接口有DOM和SAX,這兩種接口處理XML文件的方式不同, 使用場合也不同。

python有三種方法解析XML:SAX,DOM和ElementTree

1)DOM(Document Object Model):
DOM的解析器在解析一個XML文檔時,一次性讀取整個文檔,把文檔中所有元素保存在內存中的一個樹結構里,之后利用DOM提供的不同函數來讀取該文檔的內容和結構,也可以把修改過的內容寫入XML文件。由於DOM是將XML讀取到內存,然后解析成一個樹,如果要處理的XML文本比較大的話,就會很耗內存,所以DOM一般偏向於處理一些小的XML,(如配置文件)比較快。


2)SAX(simple API for XML):
Python標准庫中包含SAX解析器,SAX是用的是事件驅動模型,通過在解析XML過程中觸發一個個的事件並調用用戶定義的回調函數來處理XML文件。

3)ElementTree(元素樹)
ElementTree就像一個輕量級的DOM,具有方便友好的API。代碼可用性好,速度快,消耗內存少。

xml.dom解析XML詳解介紹:

1)先定義一個data4.xml文件,如下:

2)安裝xmltodict第三方模塊:安裝的方式有兩種,一種是通過命令行 pip install  xmltodict;第二種是通過pycharm的settings中搜索安裝該模塊

3)解析代碼:

#導包
import xmltodict
import json
with open("data4.xml",encoding="utf-8") as fp:
# 參數可以是字符串也可以是文件流對象
get_xml=xmltodict.parse(fp.read())
print(get_xml)
print("根標簽的屬性:",get_xml["people_info"]['@name'])
print("根標簽下people_1子標簽hegiht屬性值:",get_xml["people_info"]["people_1"]["@height"])
fp.seek(0)
#可以直接將結果轉換成json格式
print(json.dumps(xmltodict.parse(fp.read()),ensure_ascii=False))

執行結果如下:

 

 

4)需求:需要對data4.xml文件中的所有根標簽下的以people開頭的子標簽文本內容全部以字典的形式定義成一組數據,最后全部寫入到一個列表中;代碼如下:

#導包
import xmltodict
import json
def get_xml_data(input):
'''
:param input: 傳入鍵的開頭值
:return:
'''
list1=[]
with open("data4.xml",encoding="utf-8") as fp:
#解析xml得到字典格式;存在根標簽
get_result=json.loads(json.dumps(xmltodict.parse(fp.read()),ensure_ascii=False))
#取到根標簽的值然后進行遍歷鍵和值,然后再根據鍵以people開頭的標簽取出對應的值
for key,value in list(get_result.values())[0].items():
dict1={}
if str(key).startswith(input):
#子標簽可能存在屬性,屬性一般通過xmltodict轉換后得到的通常都是以@開頭的
for get_key,get_value in value.items():
if not str(get_key).startswith("@"):
dict1[get_key]=get_value
list1.append(dict1)
return list1

#調用測試代碼
print(get_xml_data("people"))

執行結果,如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM