Python XML 基本操作示例詳解
1. 概述
XML(Extensible Markup Language)中文譯為可擴(kuò)展標(biāo)記語言,它是一種簡單、靈活、易擴(kuò)展的文本格式,它主要關(guān)注數(shù)據(jù)內(nèi)容,常用來傳送、存儲(chǔ)數(shù)據(jù)。
當(dāng)通過 XML 來傳送數(shù)據(jù)時(shí),自然會(huì)涉及到 XML 的解析工作,通常 Python 可以通過如下三種方式來解析 XML:
DOM
DOM 方式會(huì)將整個(gè) XML 讀入內(nèi)存,在內(nèi)存中解析成一個(gè)樹,通過對樹的操作來操作 XML,該方式占用內(nèi)存較大,解析速度較慢。SAX
SAX 方式逐行掃描 XML 文檔,邊掃描邊解析,占用內(nèi)存較小,速度較快,缺點(diǎn)是不能像 DOM 方式那樣長期留駐在內(nèi)存,數(shù)據(jù)不是長久的,事件過后,若沒保存數(shù)據(jù),數(shù)據(jù)會(huì)丟失。ElementTree
ElementTree 方式幾乎兼具了 DOM 方式與 SAX 方式的優(yōu)點(diǎn),占用內(nèi)存較小、速度較快、使用也較為簡單。
2. 寫入
首先,我們通過 Python 創(chuàng)建一個(gè) XML 文檔并向其中寫入一些數(shù)據(jù),實(shí)現(xiàn)代碼如下所示:
from xml.etree import ElementTree as et import xml.dom.minidom as minidom # 創(chuàng)建根節(jié)點(diǎn) root = et.Element('school') names = ['張三', '李四'] genders = ['男', '女'] ages = ['20', '18'] # 添加子節(jié)點(diǎn) student1 = et.SubElement(root, 'student') student2 = et.SubElement(root, 'student') et.SubElement(student1, 'name').text = names[0] et.SubElement(student1, 'gender').text = genders[0] et.SubElement(student1, 'age').text = ages[0] et.SubElement(student2, 'name').text = names[1] et.SubElement(student2, 'gender').text = genders[1] et.SubElement(student2, 'age').text = ages[1] # 將根目錄轉(zhuǎn)化為樹行結(jié)構(gòu) tree = et.ElementTree(root) rough_str = et.tostring(root, 'utf-8') # 格式化 reparsed = minidom.parseString(rough_str) new_str = reparsed.toprettyxml(indent='\t') f = open('test.xml', 'w', encoding='utf-8') # 保存 f.write(new_str) f.close()
看一下效果:
3. 解析
我們分別使用 DOM、SAX、ElementTree 方式解析上面生成的 XML 文件。
3.1 DOM 方式
看一下如何通過 DOM 方式進(jìn)行解析,實(shí)現(xiàn)代碼如下所示:
from xml.dom.minidom import parse # 讀取文件 dom = parse('test.xml') # 獲取文檔元素對象 elem = dom.documentElement # 獲取 student stus = elem.getElementsByTagName('student') for stu in stus: # 獲取標(biāo)簽中內(nèi)容 name = stu.getElementsByTagName('name')[0].childNodes[0].nodeValue gender = stu.getElementsByTagName('gender')[0].childNodes[0].nodeValue age = stu.getElementsByTagName('age')[0].childNodes[0].nodeValue print('name:', name, ', gender:', gender, ', age:', age)
執(zhí)行結(jié)果:
name: 張三 , gender: 男 , age: 20
name: 李四 , gender: 女 , age: 18
3.2 SAX 方式
看一下如何通過 SAX 方式進(jìn)行解析,實(shí)現(xiàn)代碼如下所示:
import xml.sax class StudentHandler(xml.sax.ContentHandler): def __init__(self): self.name = '' self.age = '' self.gender = '' # 元素開始調(diào)用 def startElement(self, tag, attributes): self.CurrentData = tag # 元素結(jié)束調(diào)用 def endElement(self, tag): if self.CurrentData == 'name': print('name:', self.name) elif self.CurrentData == 'gender': print('gender:', self.gender) elif self.CurrentData == 'age': print('age:', self.age) self.CurrentData = '' # 讀取字符時(shí)調(diào)用 def characters(self, content): if self.CurrentData == 'name': self.name = content elif self.CurrentData == 'gender': self.gender = content elif self.CurrentData == 'age': self.age = content if (__name__ == "__main__"): # 創(chuàng)建 XMLReader parser = xml.sax.make_parser() # 關(guān)閉命名空間 parser.setFeature(xml.sax.handler.feature_namespaces, 0) # 重寫 ContextHandler Handler = StudentHandler() parser.setContentHandler(Handler) parser.parse('test.xml')
執(zhí)行結(jié)果:
name: 張三
gender: 男
age: 20
name: 李四
gender: 女
age: 18
3.3 ElementTree 方式
看一下如何通過 ElementTree 方式進(jìn)行解析,實(shí)現(xiàn)代碼如下所示:
import xml.etree.ElementTree as et tree = et.parse('test.xml') # 根節(jié)點(diǎn) root = tree.getroot() for stu in root: print('name:', stu[0].text, ', gender:', stu[1].text, ', age:', stu[2].text)
執(zhí)行結(jié)果:
name: 張三 , gender: 男 , age: 20
name: 李四 , gender: 女 , age: 18
到此這篇關(guān)于Python XML 基本操作的文章就介紹到這了,更多相關(guān)Python XML 操作內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django開發(fā)web后端對比SpringBoot示例分析
這篇文章主要介紹了Django開發(fā)web后端對比SpringBoot示例分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-12-12python編程學(xué)習(xí)使用管道Pipe編寫優(yōu)化代碼
大家好,今天這篇文章我將詳細(xì)講解 Pipe 如何讓你的代碼更加簡潔的方法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11PyTorch 如何設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn)
這篇文章主要介紹了PyTorch 設(shè)置隨機(jī)數(shù)種子使結(jié)果可復(fù)現(xiàn)操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05Biblibili視頻投稿接口分析并以Python實(shí)現(xiàn)自動(dòng)投稿功能
這篇文章主要介紹了Biblibili視頻投稿接口分析并以Python實(shí)現(xiàn)自動(dòng)投稿功能,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02實(shí)現(xiàn)python?namedtuple元類編程
這篇文章主要為大家介紹了實(shí)現(xiàn)python?namedtuple元類編程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07