Python XML 基本操作示例詳解
1. 概述
XML(Extensible Markup Language)中文譯為可擴(kuò)展標(biāo)記語(yǔ)言,它是一種簡(jiǎn)單、靈活、易擴(kuò)展的文本格式,它主要關(guān)注數(shù)據(jù)內(nèi)容,常用來(lái)傳送、存儲(chǔ)數(shù)據(jù)。
當(dāng)通過(guò) XML 來(lái)傳送數(shù)據(jù)時(shí),自然會(huì)涉及到 XML 的解析工作,通常 Python 可以通過(guò)如下三種方式來(lái)解析 XML:
DOM
DOM 方式會(huì)將整個(gè) XML 讀入內(nèi)存,在內(nèi)存中解析成一個(gè)樹(shù),通過(guò)對(duì)樹(shù)的操作來(lái)操作 XML,該方式占用內(nèi)存較大,解析速度較慢。SAX
SAX 方式逐行掃描 XML 文檔,邊掃描邊解析,占用內(nèi)存較小,速度較快,缺點(diǎn)是不能像 DOM 方式那樣長(zhǎng)期留駐在內(nèi)存,數(shù)據(jù)不是長(zhǎng)久的,事件過(guò)后,若沒(méi)保存數(shù)據(jù),數(shù)據(jù)會(huì)丟失。ElementTree
ElementTree 方式幾乎兼具了 DOM 方式與 SAX 方式的優(yōu)點(diǎn),占用內(nèi)存較小、速度較快、使用也較為簡(jiǎn)單。
2. 寫(xiě)入
首先,我們通過(guò) Python 創(chuàng)建一個(gè) XML 文檔并向其中寫(xiě)入一些數(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)化為樹(shù)行結(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 方式
看一下如何通過(guò) DOM 方式進(jìn)行解析,實(shí)現(xiàn)代碼如下所示:
from xml.dom.minidom import parse
# 讀取文件
dom = parse('test.xml')
# 獲取文檔元素對(duì)象
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 方式
看一下如何通過(guò) SAX 方式進(jìn)行解析,實(shí)現(xiàn)代碼如下所示:
import xml.sax
class StudentHandler(xml.sax.ContentHandler):
def __init__(self):
self.name = ''
self.age = ''
self.gender = ''
# 元素開(kāi)始調(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)
# 重寫(xiě) ContextHandler
Handler = StudentHandler()
parser.setContentHandler(Handler)
parser.parse('test.xml')執(zhí)行結(jié)果:
name: 張三
gender: 男
age: 20
name: 李四
gender: 女
age: 18
3.3 ElementTree 方式
看一下如何通過(guò) 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)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python操作注冊(cè)表的方法實(shí)現(xiàn)
Python提供了winreg模塊,可以用于操作Windows注冊(cè)表,本文就來(lái)介紹一下python操作注冊(cè)表的方法實(shí)現(xiàn),主要包括打開(kāi)注冊(cè)表、讀取注冊(cè)表值、寫(xiě)入注冊(cè)表值和關(guān)閉注冊(cè)表,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08
如何利用python獲取鼠標(biāo)點(diǎn)擊的實(shí)時(shí)位置案例
這篇文章主要給大家介紹了關(guān)于如何利用python獲取鼠標(biāo)點(diǎn)擊的實(shí)時(shí)位置,并展示了如何安裝和使用該庫(kù),文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-12-12
詳解pycharm自動(dòng)import所需的庫(kù)的操作方法
這篇文章主要介紹了pycharm自動(dòng)import所需的庫(kù)的操作方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11
Python抓取數(shù)據(jù)到可視化全流程的實(shí)現(xiàn)過(guò)程
這篇文章主要介紹了Python抓取數(shù)據(jù)到可視化全流程的實(shí)現(xiàn)過(guò)程,2022-01-01
Python實(shí)現(xiàn)自動(dòng)識(shí)別并批量轉(zhuǎn)換文本文件編碼
這篇文章主要為大家詳細(xì)介紹了如何利用Python實(shí)現(xiàn)自動(dòng)識(shí)別并批量轉(zhuǎn)換文本文件編碼的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下2023-03-03
Python面向?qū)ο缶幊讨?lèi)的進(jìn)階
這篇文章主要介紹了Python面向?qū)ο缶幊讨?lèi)的引用,引用 Reference是對(duì)象的指針,引用是內(nèi)存中真實(shí)對(duì)象的指針,表示為變量名或者內(nèi)存地址、每個(gè)對(duì)象存在至少一個(gè)引用,id()函數(shù)用于獲得引用,想具體了解的小伙伴可以參考下面文章的內(nèi)容2021-11-11
python中的pygame實(shí)現(xiàn)接球小游戲
這篇文章主要介紹了python中的pygame實(shí)現(xiàn)接球小游戲,文章基于python的相關(guān)資料展開(kāi)詳細(xì)的內(nèi)容,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04
使用Python創(chuàng)建一個(gè)視頻管理器并實(shí)現(xiàn)視頻截圖功能
在這篇博客中,我將向大家展示如何使用 wxPython 創(chuàng)建一個(gè)簡(jiǎn)單的圖形用戶(hù)界面 (GUI) 應(yīng)用程序,該應(yīng)用程序可以管理視頻文件列表、播放視頻,并生成視頻截圖,我們將逐步實(shí)現(xiàn)這些功能,并確保代碼易于理解和擴(kuò)展,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-08-08
python格式化輸出%s與format()的用法對(duì)比
這篇文章主要為大家介紹了python格式化輸出%s與format()的用法對(duì)比,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-10-10

