Python中xml.etree.ElementTree的使用示例

 更新时间:2024年09月20日 11:32:10   作者:pumpkin84514  
ElementTree是Python标准库中的一个模块,专门用于处理XML文件,它提供了解析、创建、修改和遍历XML文档的API,非常适合处理配置文件、数据交换格式和Web服务响应等场景,本文就来介绍一下,感兴趣的可以了解一下

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实现的调用C语言函数功能简单实例

    Python实现的调用C语言函数功能简单实例

    这篇文章主要介绍了Python实现的调用C语言函数功能,结合简单实例形式分析了Python使用ctypes模块调用C语言函数的具体步骤与相关操作技巧,需要的朋友可以参考下
    2019-03-03
  • 利用Python实现岗位的分析报告

    利用Python实现岗位的分析报告

    这篇文章主要为大家详细介绍了如何利用Python实现岗位的分析报告,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • Python以表格形式输出内容到终端的常见方式

    Python以表格形式输出内容到终端的常见方式

    在Python编程语言中,我们经常需要在终端输出数据,并且有时候需要以表格的形式展示数据,本文将介绍如何在Python中使用这些库来输出表格,需要的可以参考下
    2025-05-05
  • python读写ini文件示例(python读写文件)

    python读写ini文件示例(python读写文件)

    项目用到数据库,多个地方使用,不能硬编码。ython支持ini文件的读取,就在项目中使用了ini文件,下面是示例
    2014-03-03
  • 浅谈pandas dataframe对除数是零的处理

    浅谈pandas dataframe对除数是零的处理

    这篇文章主要介绍了浅谈pandas dataframe对除数是零的处理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Python Zipfile模块进行ZIP文件的创建解压信息获取和加密等操作

    Python Zipfile模块进行ZIP文件的创建解压信息获取和加密等操作

    这篇文章主要为大家介绍了Python Zipfile模块进行ZIP文件的创建解压信息获取和加密等操作,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 如何判断pytorch是否支持GPU加速

    如何判断pytorch是否支持GPU加速

    这篇文章主要介绍了判断pytorch是否支持GPU加速的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Python中PyAutoGUI帮助文档(推荐!)

    Python中PyAutoGUI帮助文档(推荐!)

    PyAutoGui是一个跨平台GUI自动化库,PyAutoGUI是一个Python模块,用于以编程方式控制鼠标和键盘,下面这篇文章主要给大家介绍了关于Python中PyAutoGUI帮助文档的相关资料,需要的朋友可以参考下
    2022-03-03
  • python except异常处理之后不退出,解决异常继续执行的实现

    python except异常处理之后不退出,解决异常继续执行的实现

    这篇文章主要介绍了python except异常处理之后不退出,解决异常继续执行的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-04-04
  • Python2.6版本pip安装步骤解析

    Python2.6版本pip安装步骤解析

    这篇文章主要介绍了Python2.6版本pip安装步骤解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08

最新评论