Python中xml.etree.ElementTree的使用示例
xml.etree.ElementTree
(简称ElementTree
)是Python标准库中用于处理XML文件的模块。它提供了简洁且高效的API,适用于解析、创建和修改XML文档。在需要处理XML数据的场景中,比如配置文件、数据交换格式、Web服务响应等,ElementTree
都是非常实用的工具。
一、基本使用场景
- 解析XML文档:读取并解析XML文档,将其转换为树结构以便进一步操作。
- 创建XML文档:从头开始构建XML文档,并将其保存到文件中。
- 修改XML文档:在解析后的XML树中添加、删除或修改元素。
- 搜索与遍历XML树:查找特定的元素或属性,遍历整个XML树结构。
二、核心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. 创建XML文档
import xml.etree.ElementTree as ET # 创建根元素 root = ET.Element('data') # 创建子元素 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
内容:
<?xml version='1.0' encoding='utf-8'?> <data> <user> <name>John</name> <age>30</age> </user> </data>
3. 修改XML文档
修改现有元素的文本内容:
import xml.etree.ElementTree as ET tree = ET.parse('output.xml') root = tree.getroot() # 修改元素内容 root.find('user/name').text = 'Jane' tree.write('output_modified.xml', encoding='utf-8', xml_declaration=True)
output_modified.xml
内容:
<?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
三、进阶用法
1. 处理带有命名空间的XML
命名空间在复杂XML文档中非常常见,用于区分不同元素的作用域。
解析带有命名空间的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. 批量处理和转换XML
当需要处理大量的XML数据时,可以利用生成器或者批量处理方法来提高效率。
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() # 清除元素以节省内存 for user in parse_large_xml('large_users.xml'): print(user.find('name').text)
四、常用技巧
1. 使用生成器高效解析大文件
如上所述,使用iterparse()
和生成器可以有效节省内存并提高处理速度,适用于大文件的解析。
2. 自动缩进与格式化输出
默认情况下,ElementTree
生成的XML是无缩进的,可以通过手动调整生成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
内容:
<?xml version='1.0' encoding='utf-8'?> <root> <child /> </root>
3. 安全处理外部实体
在处理来自不受信任源的XML数据时,最好禁用外部实体,以防止XML外部实体注入(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解析方法,防止常见的安全漏洞。
到此这篇关于Python中xml.etree.ElementTree的使用示例的文章就介绍到这了,更多相关Python xml.etree.ElementTree内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
python数据解析BeautifulSoup爬取三国演义章节示例
这篇文章主要介绍了python数据解析BeautifulSoup爬取三国演义章节示例,文中附含详细示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助2021-09-09Pytorch参数注册和nn.ModuleList nn.ModuleDict的问题
这篇文章主要介绍了Pytorch参数注册和nn.ModuleList nn.ModuleDict的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2023-01-01利用Python Difflib库强大的文字比较功能快速轻松查重
这篇文章主要介绍了利用Python Difflib库强大的文字比较功能快速轻松查重实例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪2024-01-01python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据示例
这篇文章主要介绍了python3 BeautifulSoup模块使用字典的方法抓取a标签内的数据,结合实例形式Fenix了python3 BeautifulSoup模块进行数据的抓取相关操作技巧,需要的朋友可以参考下2019-11-11
最新评论