Python中xml.etree.ElementTree的使用示例
xml.etree.ElementTree(簡稱ElementTree)是Python標(biāo)準(zhǔn)庫中用于處理XML文件的模塊。它提供了簡潔且高效的API,適用于解析、創(chuàng)建和修改XML文檔。在需要處理XML數(shù)據(jù)的場(chǎng)景中,比如配置文件、數(shù)據(jù)交換格式、Web服務(wù)響應(yīng)等,ElementTree都是非常實(shí)用的工具。
一、基本使用場(chǎng)景
- 解析XML文檔:讀取并解析XML文檔,將其轉(zhuǎn)換為樹結(jié)構(gòu)以便進(jìn)一步操作。
- 創(chuàng)建XML文檔:從頭開始構(gòu)建XML文檔,并將其保存到文件中。
- 修改XML文檔:在解析后的XML樹中添加、刪除或修改元素。
- 搜索與遍歷XML樹:查找特定的元素或?qū)傩裕闅v整個(gè)XML樹結(jié)構(gòu)。
二、核心API與用法
1. 解析XML文檔
解析字符串形式的XML:
import xml.etree.ElementTree as ET
xml_data = '''<data>
<user>
<name>John</name>
<age>30</age>
</user>
</data>'''
root = ET.fromstring(xml_data)
print(root.tag)
輸出:
data
解析XML文件:
import xml.etree.ElementTree as ET
tree = ET.parse('example.xml')
root = tree.getroot()
print(root.tag)
輸出:
data
2. 創(chuàng)建XML文檔
import xml.etree.ElementTree as ET
# 創(chuàng)建根元素
root = ET.Element('data')
# 創(chuàng)建子元素
user = ET.SubElement(root, 'user')
name = ET.SubElement(user, 'name')
name.text = 'John'
age = ET.SubElement(user, 'age')
age.text = '30'
# 將XML樹寫入文件
tree = ET.ElementTree(root)
tree.write('output.xml', encoding='utf-8', xml_declaration=True)
生成的output.xml內(nèi)容:
<?xml version='1.0' encoding='utf-8'?>
<data>
<user>
<name>John</name>
<age>30</age>
</user>
</data>
3. 修改XML文檔
修改現(xiàn)有元素的文本內(nèi)容:
import xml.etree.ElementTree as ET
tree = ET.parse('output.xml')
root = tree.getroot()
# 修改元素內(nèi)容
root.find('user/name').text = 'Jane'
tree.write('output_modified.xml', encoding='utf-8', xml_declaration=True)
output_modified.xml內(nèi)容:
<?xml version='1.0' encoding='utf-8'?>
<data>
<user>
<name>Jane</name>
<age>30</age>
</user>
</data>
4. 搜索與遍歷XML樹
遍歷所有子元素:
import xml.etree.ElementTree as ET
tree = ET.parse('output.xml')
root = tree.getroot()
for child in root.iter():
print(child.tag, child.text)
輸出:
data None
user None
name John
age 30
查找特定元素:
import xml.etree.ElementTree as ET
tree = ET.parse('output.xml')
root = tree.getroot()
name = root.find('user/name')
print(name.text)
輸出:
John
三、進(jìn)階用法
1. 處理帶有命名空間的XML
命名空間在復(fù)雜XML文檔中非常常見,用于區(qū)分不同元素的作用域。
解析帶有命名空間的XML:
import xml.etree.ElementTree as ET
xml_data = '''<root xmlns:h="http://www.w3.org/TR/html4/" xmlns:f="http://www.w3schools.com/furniture">
<h:table>
<h:tr>
<h:td>Apples</h:td>
<h:td>Bananas</h:td>
</h:tr>
</h:table>
<f:table>
<f:name>African Coffee Table</f:name>
<f:width>80</f:width>
<f:length>120</f:length>
</f:table>
</root>'''
root = ET.fromstring(xml_data)
# 使用命名空間解析
for table in root.findall('{http://www.w3.org/TR/html4/}table'):
for td in table.findall('{http://www.w3.org/TR/html4/}td'):
print(td.text)
輸出:
Apples
Bananas
2. 使用XPath查找元素
雖然ElementTree本身不支持完整的XPath語法,但提供了類似的路徑查找功能。
import xml.etree.ElementTree as ET
xml_data = '''<root>
<users>
<user id="1">
<name>John</name>
</user>
<user id="2">
<name>Jane</name>
</user>
</users>
</root>'''
root = ET.fromstring(xml_data)
# 查找id為2的用戶的名稱
name = root.find('.//user[@id="2"]/name').text
print(name)
輸出:
Jane
3. 批量處理和轉(zhuǎn)換XML
當(dāng)需要處理大量的XML數(shù)據(jù)時(shí),可以利用生成器或者批量處理方法來提高效率。
import xml.etree.ElementTree as ET
def parse_large_xml(file):
context = ET.iterparse(file, events=('start', 'end'))
for event, elem in context:
if event == 'end' and elem.tag == 'user':
yield elem
elem.clear() # 清除元素以節(jié)省內(nèi)存
for user in parse_large_xml('large_users.xml'):
print(user.find('name').text)
四、常用技巧
1. 使用生成器高效解析大文件
如上所述,使用iterparse()和生成器可以有效節(jié)省內(nèi)存并提高處理速度,適用于大文件的解析。
2. 自動(dòng)縮進(jìn)與格式化輸出
默認(rèn)情況下,ElementTree生成的XML是無縮進(jìn)的,可以通過手動(dòng)調(diào)整生成XML的格式來使其更具可讀性。
import xml.etree.ElementTree as ET
def indent(elem, level=0):
i = "\n" + level*" "
if len(elem):
if not elem.text or not elem.text.strip():
elem.text = i + " "
if not elem.tail or not elem.tail.strip():
elem.tail = i
for subelem in elem:
indent(subelem, level+1)
if not elem.tail or not elem.tail.strip():
elem.tail = i
else:
if level and (not elem.tail or not elem.tail.strip()):
elem.tail = i
root = ET.Element("root")
child = ET.SubElement(root, "child")
indent(root)
tree = ET.ElementTree(root)
tree.write("output_pretty.xml", encoding="utf-8", xml_declaration=True)
生成的output_pretty.xml內(nèi)容:
<?xml version='1.0' encoding='utf-8'?> <root> <child /> </root>
3. 安全處理外部實(shí)體
在處理來自不受信任源的XML數(shù)據(jù)時(shí),最好禁用外部實(shí)體,以防止XML外部實(shí)體注入(XXE)攻擊。
import xml.etree.ElementTree as ET
from defusedxml.ElementTree import parse, fromstring
# 安全地解析XML
tree = parse('example.xml')
root = tree.getroot()
# 或者
root = fromstring(xml_data)
defusedxml庫提供了更安全的XML解析方法,防止常見的安全漏洞。
到此這篇關(guān)于Python中xml.etree.ElementTree的使用示例的文章就介紹到這了,更多相關(guān)Python xml.etree.ElementTree內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python+opencv 實(shí)現(xiàn)圖片文字的分割的方法示例
這篇文章主要介紹了Python+opencv 實(shí)現(xiàn)圖片文字的分割的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-07-07
Python使用PyPDF2和ReportLab操作PDF文件的詳細(xì)指南
在日常工作和項(xiàng)目中,PDF 文件處理是個(gè)常見需求,不論是合并報(bào)告、加密文檔、填充表單,還是生成發(fā)票,Python 中有許多用于操作 PDF 文件的庫,其中 PyPDF2 和 ReportLab 是兩個(gè)廣泛使用的工具,本文給大家介紹了Python使用PyPDF2和ReportLab操作PDF文件的詳細(xì)指南2025-01-01
Python登錄系統(tǒng)界面實(shí)現(xiàn)詳解
這篇文章主要介紹了Python登錄系統(tǒng)界面實(shí)現(xiàn)詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下2019-06-06

