「Python系列」Python XML解析

本文涉及的产品
性能测试 PTS,5000VUM额度
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 在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列表
相关文章
|
19天前
|
数据采集 JSON API
如何利用Python爬虫淘宝商品详情高级版(item_get_pro)API接口及返回值解析说明
本文介绍了如何利用Python爬虫技术调用淘宝商品详情高级版API接口(item_get_pro),获取商品的详细信息,包括标题、价格、销量等。文章涵盖了环境准备、API权限申请、请求构建和返回值解析等内容,强调了数据获取的合规性和安全性。
|
17天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
78 5
|
30天前
|
存储 缓存 Python
Python中的装饰器深度解析与实践
在Python的世界里,装饰器如同一位神秘的魔法师,它拥有改变函数行为的能力。本文将揭开装饰器的神秘面纱,通过直观的代码示例,引导你理解其工作原理,并掌握如何在实际项目中灵活运用这一强大的工具。从基础到进阶,我们将一起探索装饰器的魅力所在。
|
1月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
51 7
|
2月前
|
XML 数据采集 数据格式
Python 爬虫必备杀器,xpath 解析 HTML
【11月更文挑战第17天】XPath 是一种用于在 XML 和 HTML 文档中定位节点的语言,通过路径表达式选取节点或节点集。它不仅适用于 XML,也广泛应用于 HTML 解析。基本语法包括标签名、属性、层级关系等的选择,如 `//p` 选择所有段落标签,`//a[@href=&#39;example.com&#39;]` 选择特定链接。在 Python 中,常用 lxml 库结合 XPath 进行网页数据抓取,支持高效解析与复杂信息提取。高级技巧涵盖轴的使用和函数应用,如 `contains()` 用于模糊匹配。
|
2月前
|
测试技术 开发者 Python
使用Python解析和分析源代码
本文介绍了如何使用Python的`ast`模块解析和分析Python源代码,包括安装准备、解析源代码、分析抽象语法树(AST)等步骤,展示了通过自定义`NodeVisitor`类遍历AST并提取信息的方法,为代码质量提升和自动化工具开发提供基础。
68 8
|
2月前
|
数据可视化 图形学 Python
在圆的外面画一个正方形:Python实现与技术解析
本文介绍了如何使用Python的`matplotlib`库绘制一个圆,并在其外部绘制一个正方形。通过计算正方形的边长和顶点坐标,实现了圆和正方形的精确对齐。代码示例详细展示了绘制过程,适合初学者学习和实践。
53 9
|
2月前
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
20 1
|
3月前
|
XML 前端开发 Java
讲解SSM的xml文件
本文详细介绍了SSM框架中的xml配置文件,包括springMVC.xml和applicationContext.xml,涉及组件扫描、数据源配置、事务管理、MyBatis集成以及Spring MVC的视图解析器配置。
86 1
|
5月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)