广告位联系
返回顶部
分享到

Python中xml.etree.ElementTree的使用

python 来源:互联网 作者:佚名 发布时间:2024-09-20 16:40:41 人浏览
摘要

xml.etree.ElementTree(简称ElementTree)是Python标准库中用于处理XML文件的模块。它提供了简洁且高效的API,适用于解析、创建和修改XML文档。在需要处理XML数据的场景中,比如配置文件、数据交换格

xml.etree.ElementTree(简称ElementTree)是Python标准库中用于处理XML文件的模块。它提供了简洁且高效的API,适用于解析、创建和修改XML文档。在需要处理XML数据的场景中,比如配置文件、数据交换格式、Web服务响应等,ElementTree都是非常实用的工具。

一、基本使用场景

  • 解析XML文档:读取并解析XML文档,将其转换为树结构以便进一步操作。
  • 创建XML文档:从头开始构建XML文档,并将其保存到文件中。
  • 修改XML文档:在解析后的XML树中添加、删除或修改元素。
  • 搜索与遍历XML树:查找特定的元素或属性,遍历整个XML树结构。

二、核心API与用法

1. 解析XML文档

解析字符串形式的XML:

1

2

3

4

5

6

7

8

9

10

11

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文件:

1

2

3

4

5

import xml.etree.ElementTree as ET

 

tree = ET.parse('example.xml')

root = tree.getroot()

print(root.tag)

输出:

data

2. 创建XML文档

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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内容:

1

2

3

4

5

6

7

<?xml version='1.0' encoding='utf-8'?>

<data>

    <user>

        <name>John</name>

        <age>30</age>

    </user>

</data>

3. 修改XML文档

修改现有元素的文本内容:

1

2

3

4

5

6

7

8

9

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内容:

1

2

3

4

5

6

7

<?xml version='1.0' encoding='utf-8'?>

<data>

    <user>

        <name>Jane</name>

        <age>30</age>

    </user>

</data>

4. 搜索与遍历XML树

遍历所有子元素:

1

2

3

4

5

6

7

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

查找特定元素:

1

2

3

4

5

6

7

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:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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语法,但提供了类似的路径查找功能。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

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数据时,可以利用生成器或者批量处理方法来提高效率。

1

2

3

4

5

6

7

8

9

10

11

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的格式来使其更具可读性。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

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内容:

1

2

3

4

<?xml version='1.0' encoding='utf-8'?>

<root>

  <child />

</root>

3. 安全处理外部实体

在处理来自不受信任源的XML数据时,最好禁用外部实体,以防止XML外部实体注入(XXE)攻击。

1

2

3

4

5

6

7

8

9

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解析方法,防止常见的安全漏洞。


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • Python中xml.etree.ElementTree的使用
    xml.etree.ElementTree(简称ElementTree)是Python标准库中用于处理XML文件的模块。它提供了简洁且高效的API,适用于解析、创建和修改XML文档。在需
  • python中concurrent.futures的具体使用
    concurrent.futures是 Python 标准库中用于并行编程的高级模块,它提供了一种高级别的接口来管理线程和进程。通过这个模块,你可以轻松地利用
  • Python中跳出循环的两种方法

    Python中跳出循环的两种方法
    我们经常遇到循环在进行到某一个特定的值时,需要跳出循环,或跳过这个值,python中早已为我们准备了这样的参数:break,continue 比如下面的
  • 解决Python调用df.to_csv()出现中文乱码的问题

    解决Python调用df.to_csv()出现中文乱码的问题
    Python调用df.to_csv()出现中文乱码 1 2 3 4 df = pd.DataFrame(data=total_info, columns=[公司全名, 公司简称, 公司规模, 融资阶段, 区域, 职位名称, 工作经验
  • PyTorch池化层详解及作用

    PyTorch池化层详解及作用
    在深度学习中,池化层(Pooling Layer)是卷积神经网络(CNN)中的关键组成部分。池化层的主要功能是对特征图进行降维和减少计算量,同时
  • python实现列表推导式与生成器的介绍
    列表推导式和生成器是 Python 中的两个非常有用的工具。它们可以帮助你以简洁和高效的方式创建和处理数据集合。了解它们的用法不仅可以
  • python关于图片和base64互转的三种方式

    python关于图片和base64互转的三种方式
    通过cv2进行转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 import cv2 import base64 import numpy as np def img_to_base64(img_array): # 传入图片为RGB格式numpy矩阵,
  • Python虚拟环境virtualenv安装的详细教程保姆级(Wi

    Python虚拟环境virtualenv安装的详细教程保姆级(Wi
    虚拟环境安装 工作中我们经常会根据不同的项目切换不同的python环境,如果仅仅是在本地就安装一个python环境,项目移植也要重新配置环境
  • python中eval的用法介绍

    python中eval的用法介绍
    python中eval的用法 eval(字符串) 能够以Python表达式的方式解析并执行字符串,并将返回结果输出。 eval()函数将去掉字符串的两个引号,将其解
  • Python使用切片移动元素位置的代码
    一.基本介绍 1.切片基础 在 Python 中,切片是指从序列类型(如列表、字符串、元组等)中提取子序列的过程。切片的基本语法如下: 1 seq
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计