「Python系列」Python XML解析

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 在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列表
相关文章
|
16天前
|
XML JSON 数据处理
超越JSON:Python结构化数据处理模块全解析
本文深入解析Python中12个核心数据处理模块,涵盖csv、pandas、pickle、shelve、struct、configparser、xml、numpy、array、sqlite3和msgpack,覆盖表格处理、序列化、配置管理、科学计算等六大场景,结合真实案例与决策树,助你高效应对各类数据挑战。(238字)
90 0
|
20天前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
125 0
|
28天前
|
数据采集 存储 JavaScript
解析Python爬虫中的Cookies和Session管理
Cookies与Session是Python爬虫中实现状态保持的核心。Cookies由服务器发送、客户端存储,用于标识用户;Session则通过唯一ID在服务端记录会话信息。二者协同实现登录模拟与数据持久化。
|
2月前
|
JSON 缓存 开发者
淘宝商品详情接口(item_get)企业级全解析:参数配置、签名机制与 Python 代码实战
本文详解淘宝开放平台taobao.item_get接口对接全流程,涵盖参数配置、MD5签名生成、Python企业级代码实现及高频问题排查,提供可落地的实战方案,助你高效稳定获取商品数据。
|
2月前
|
存储 大数据 Unix
Python生成器 vs 迭代器:从内存到代码的深度解析
在Python中,处理大数据或无限序列时,迭代器与生成器可避免内存溢出。迭代器通过`__iter__`和`__next__`手动实现,控制灵活;生成器用`yield`自动实现,代码简洁、内存高效。生成器适合大文件读取、惰性计算等场景,是性能优化的关键工具。
192 2
|
2月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
515 0
|
2月前
|
机器学习/深度学习 JSON Java
Java调用Python的5种实用方案:从简单到进阶的全场景解析
在机器学习与大数据融合背景下,Java与Python协同开发成为企业常见需求。本文通过真实案例解析5种主流调用方案,涵盖脚本调用到微服务架构,助力开发者根据业务场景选择最优方案,提升开发效率与系统性能。
539 0
机器学习/深度学习 算法 自动驾驶
328 0
|
2月前
|
算法 安全 数据安全/隐私保护
Python随机数函数全解析:5个核心工具的实战指南
Python的random模块不仅包含基础的随机数生成函数,还提供了如randint()、choice()、shuffle()和sample()等实用工具,适用于游戏开发、密码学、统计模拟等多个领域。本文深入解析这些函数的用法、底层原理及最佳实践,帮助开发者高效利用随机数,提升代码质量与安全性。
381 0
|
2月前
|
数据可视化 Linux iOS开发
Python脚本转EXE文件实战指南:从原理到操作全解析
本教程详解如何将Python脚本打包为EXE文件,涵盖PyInstaller、auto-py-to-exe和cx_Freeze三种工具,包含实战案例与常见问题解决方案,助你轻松发布独立运行的Python程序。
762 2

推荐镜像

更多