「Python系列」Python XML解析

本文涉及的产品
函数计算FC,每月15万CU 3个月
应用实时监控服务-用户体验监控,每月100OCU免费额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 在Python中,解析XML文件通常使用内置的`xml.etree.ElementTree`模块,它提供了一个轻量级、高效的方式来解析XML文档。此外,还有其他的第三方库,如`lxml`和`xml.dom`,它们提供了更多的功能和灵活性。

一、Python XML解析

在Python中,解析XML文件通常使用内置的xml.etree.ElementTree模块,它提供了一个轻量级、高效的方式来解析XML文档。此外,还有其他的第三方库,如lxmlxml.dom,它们提供了更多的功能和灵活性。

下面是使用xml.etree.ElementTree模块解析XML文件的一个基本示例:

首先,假设你有一个名为example.xml的XML文件,内容如下:

<root>
    <element1 attribute="value1">
        <subelement1>Text inside subelement1</subelement1>
        <subelement2 attribute2="value2">Text inside subelement2</subelement2>
    </element1>
    <element2>
        <subelement3>Text inside subelement3</subelement3>
    </element2>
</root>

接下来,你可以使用xml.etree.ElementTree来解析这个文件:

import xml.etree.ElementTree as ET

# 解析XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 遍历所有子元素
for child in root:
    print(child.tag, child.attrib)  # 打印标签名和属性

    # 遍历子元素的子元素
    for subchild in child:
        print(subchild.tag, subchild.attrib, subchild.text)  # 打印子标签名、属性和文本内容

# 查找具有特定标签的元素
for element in root.iter('subelement1'):
    print(element.text)  # 打印subelement1的文本内容

# 查找具有特定属性的元素
for element in root.iter('subelement2'):
    print(element.attrib)  # 打印subelement2的属性

上面的代码示例演示了如何使用xml.etree.ElementTree来解析XML文件,并遍历其中的元素和属性。iter()方法用于查找具有特定标签的元素。

除了xml.etree.ElementTree之外,lxml库提供了更多的功能,包括XPath支持、更高效的解析和更简洁的API。如果你需要处理复杂的XML文档,lxml可能是一个更好的选择。

使用lxml解析XML文件的一个简单示例:

from lxml import etree

# 解析XML字符串或文件
tree = etree.parse('example.xml')
root = tree.getroot()

# 使用XPath查找元素
elements = root.xpath('//element1')
for element in elements:
    print(element.xpath('subelement1/text()'))  # 打印element1下的subelement1的文本内容

# 也可以这样查找属性
attributes = root.xpath('//element1/@attribute')
print(attributes)  # 打印element1的attribute属性值

在这个示例中,lxmlxpath()方法用于执行XPath查询,从而能够更方便地定位到XML文档中的特定元素或属性。

二、Python 操作XML

在Python中操作XML文件通常涉及读取、解析、修改和写入XML内容。下面是一个使用xml.etree.ElementTree模块来操作XML文件的案例。

首先,我们创建一个简单的XML文件example.xml

<?xml version="1.0" encoding="UTF-8"?>
<students>
    <student rollno="101">
        <firstname>John</firstname>
        <lastname>Doe</lastname>
        <marks>95</marks>
    </student>
    <student rollno="102">
        <firstname>Jane</firstname>
        <lastname>Doe</lastname>
        <marks>88</marks>
    </student>
</students>

接下来,我们将使用Python代码来读取这个XML文件,对其进行修改,然后再写入到一个新的文件中。

import xml.etree.ElementTree as ET

# 读取XML文件
tree = ET.parse('example.xml')
root = tree.getroot()

# 遍历所有学生并打印他们的信息
for student in root.findall('student'):
    rollno = student.get('rollno')
    firstname = student.find('firstname').text
    lastname = student.find('lastname').text
    marks = student.find('marks').text
    print(f"Student Roll No: {rollno}, Name: {firstname} {lastname}, Marks: {marks}")

# 修改学生信息
for student in root.findall('student'):
    if student.get('rollno') == '101':
        # 修改第一个学生的成绩
        student.find('marks').text = '98'

# 写入到新的XML文件
tree.write('modified_example.xml')

运行上面的代码后,你会在控制台看到每个学生的信息,并且modified_example.xml文件会被创建或覆盖,其中第一个学生的成绩被更新为98

<?xml version='1.0' encoding='UTF-8'?>
<students>
    <student rollno="101">
        <firstname>John</firstname>
        <lastname>Doe</lastname>
        <marks>98</marks>  <!-- 这里成绩被修改了 -->
    </student>
    <student rollno="102">
        <firstname>Jane</firstname>
        <lastname>Doe</lastname>
        <marks>88</marks>
    </student>
</students>

在这个案例中,我们展示了如何使用xml.etree.ElementTree来解析XML文件,遍历元素,修改元素内容,并将修改后的XML写回到文件中。findall方法用于查找所有匹配的元素,find方法用于查找第一个匹配的元素,get方法用于获取元素的属性值。write方法用于将修改后的树写回到文件中。

如果你想执行更复杂的XML操作,比如添加新的元素或删除现有的元素,你可以使用SubElementremove方法。此外,lxml库提供了更多功能和灵活性,特别是当处理大型或复杂的XML文件时。

三、ContentHandler 类方法介绍

在Python中,ContentHandler 类通常与xml.sax模块相关联,它是SAX(Simple API for XML)解析器中的一个关键组件。SAX是一个基于事件的XML解析方法,而ContentHandler则是定义这些事件处理程序的基类。通过继承ContentHandler类并重写其方法,你可以自定义XML解析过程中的行为。

下面是一些ContentHandler类的主要方法及其描述:

  • startDocument(): 当文档开始解析时被调用。
  • endDocument(): 当文档解析结束时被调用。
  • startElement(name, attrs): 当遇到XML元素的开始标签时被调用,name是元素的名称,attrs是元素的属性字典。
  • endElement(name): 当遇到XML元素的结束标签时被调用,name是元素的名称。
  • characters(content): 当遇到XML元素或属性的字符数据时被调用,content是字符数据的内容。

下面是一个使用ContentHandler类的简单案例代码,该代码读取一个XML文件并打印出所有元素的名称和属性:

import xml.sax
from xml.sax.handler import ContentHandler

class MyContentHandler(ContentHandler):
    def startElement(self, name, attrs):
        print(f"开始元素: {name}")
        for attr_name, attr_value in attrs.items():
            print(f"  属性: {attr_name} = {attr_value}")

    def endElement(self, name):
        print(f"结束元素: {name}")

    def characters(self, content):
        print(f"字符数据: {content.strip()}")

# 创建一个SAX解析器
parser = xml.sax.make_parser()

# 将自定义的ContentHandler关联到解析器
parser.setContentHandler(MyContentHandler())

# 打开XML文件并解析
with open('example.xml', 'r') as f:
    parser.parse(f)

在这个案例中,我们创建了一个MyContentHandler类,它继承自ContentHandler。我们重写了startElementendElementcharacters方法来处理XML文档中的不同事件。然后,我们创建了一个SAX解析器,并将我们的MyContentHandler实例设置为解析器的内容处理程序。最后,我们打开XML文件并使用解析器进行解析。

请注意,这个案例仅打印了元素名称、属性和字符数据。在实际应用中,你可能需要根据XML文档的结构和内容进行更复杂的处理。此外,SAX解析器是基于事件的,因此它通常比DOM解析器更快,特别是在处理大型XML文件时。

四、相关链接

  1. Python下载安装中心
  2. Python官网
  3. Python软件下载
  4. 「Python系列」Python简介及案例
  5. 「Python系列」Python基础语法/数据类型
  6. 「Python系列」Python解释器
  7. 「Python系列」Python运算符
  8. 「Python系列」Python数据结构
  9. 「Python系列」Python元组
  10. 「Python系列」Python集合
  11. 「Python系列」Python列表
相关文章
|
9天前
|
算法 Python
Python 大神修炼手册:图的深度优先&广度优先遍历,深入骨髓的解析
在 Python 编程中,掌握图的深度优先遍历(DFS)和广度优先遍历(BFS)是进阶的关键。这两种算法不仅理论重要,还能解决实际问题。本文介绍了图的基本概念、邻接表表示方法,并给出了 DFS 和 BFS 的 Python 实现代码示例,帮助读者深入理解并应用这些算法。
20 2
|
18天前
|
测试技术 开发者 Python
深入浅出:Python中的装饰器解析与应用###
【10月更文挑战第22天】 本文将带你走进Python装饰器的世界,揭示其背后的魔法。我们将一起探索装饰器的定义、工作原理、常见用法以及如何自定义装饰器,让你的代码更加简洁高效。无论你是Python新手还是有一定经验的开发者,相信这篇文章都能为你带来新的启发和收获。 ###
12 1
|
18天前
|
设计模式 测试技术 开发者
Python中的装饰器深度解析
【10月更文挑战第24天】在Python的世界中,装饰器是那些能够为函数或类“添彩”的魔法工具。本文将带你深入理解装饰器的概念、工作原理以及如何自定义装饰器,让你的代码更加优雅和高效。
|
28天前
|
XML 前端开发 数据格式
Beautiful Soup 解析html | python小知识
在数据驱动的时代,网页数据是非常宝贵的资源。很多时候我们需要从网页上提取数据,进行分析和处理。Beautiful Soup 是一个非常流行的 Python 库,可以帮助我们轻松地解析和提取网页中的数据。本文将详细介绍 Beautiful Soup 的基础知识和常用操作,帮助初学者快速入门和精通这一强大的工具。【10月更文挑战第11天】
56 2
|
28天前
|
数据安全/隐私保护 流计算 开发者
python知识点100篇系列(18)-解析m3u8文件的下载视频
【10月更文挑战第6天】m3u8是苹果公司推出的一种视频播放标准,采用UTF-8编码,主要用于记录视频的网络地址。HLS(Http Live Streaming)是苹果公司提出的一种基于HTTP的流媒体传输协议,通过m3u8索引文件按序访问ts文件,实现音视频播放。本文介绍了如何通过浏览器找到m3u8文件,解析m3u8文件获取ts文件地址,下载ts文件并解密(如有必要),最后使用ffmpeg合并ts文件为mp4文件。
|
1月前
|
Web App开发 SQL 数据库
使用 Python 解析火狐浏览器的 SQLite3 数据库
本文介绍如何使用 Python 解析火狐浏览器的 SQLite3 数据库,包括书签、历史记录和下载记录等。通过安装 Python 和 SQLite3,定位火狐数据库文件路径,编写 Python 脚本连接数据库并执行 SQL 查询,最终输出最近访问的网站历史记录。
|
1月前
|
机器学习/深度学习 算法 Python
深度解析机器学习中过拟合与欠拟合现象:理解模型偏差背后的原因及其解决方案,附带Python示例代码助你轻松掌握平衡技巧
【10月更文挑战第10天】机器学习模型旨在从数据中学习规律并预测新数据。训练过程中常遇过拟合和欠拟合问题。过拟合指模型在训练集上表现优异但泛化能力差,欠拟合则指模型未能充分学习数据规律,两者均影响模型效果。解决方法包括正则化、增加训练数据和特征选择等。示例代码展示了如何使用Python和Scikit-learn进行线性回归建模,并观察不同情况下的表现。
266 3
|
3天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
14 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
66 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0