「Python系列」Python XML解析

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
简介: 在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列表
相关文章
|
1天前
|
存储 索引 Python
Python入门:6.深入解析Python中的序列
在 Python 中,**序列**是一种有序的数据结构,广泛应用于数据存储、操作和处理。序列的一个显著特点是支持通过**索引**访问数据。常见的序列类型包括字符串(`str`)、列表(`list`)和元组(`tuple`)。这些序列各有特点,既可以存储简单的字符,也可以存储复杂的对象。 为了帮助初学者掌握 Python 中的序列操作,本文将围绕**字符串**、**列表**和**元组**这三种序列类型,详细介绍其定义、常用方法和具体示例。
Python入门:6.深入解析Python中的序列
|
1天前
|
存储 Linux iOS开发
Python入门:2.注释与变量的全面解析
在学习Python编程的过程中,注释和变量是必须掌握的两个基础概念。注释帮助我们理解代码的意图,而变量则是用于存储和操作数据的核心工具。熟练掌握这两者,不仅能提高代码的可读性和维护性,还能为后续学习复杂编程概念打下坚实的基础。
Python入门:2.注释与变量的全面解析
|
7天前
|
监控 算法 安全
内网桌面监控软件深度解析:基于 Python 实现的 K-Means 算法研究
内网桌面监控软件通过实时监测员工操作,保障企业信息安全并提升效率。本文深入探讨K-Means聚类算法在该软件中的应用,解析其原理与实现。K-Means通过迭代更新簇中心,将数据划分为K个簇类,适用于行为分析、异常检测、资源优化及安全威胁识别等场景。文中提供了Python代码示例,展示如何实现K-Means算法,并模拟内网监控数据进行聚类分析。
28 10
|
25天前
|
存储 算法 安全
控制局域网上网软件之 Python 字典树算法解析
控制局域网上网软件在现代网络管理中至关重要,用于控制设备的上网行为和访问权限。本文聚焦于字典树(Trie Tree)算法的应用,详细阐述其原理、优势及实现。通过字典树,软件能高效进行关键词匹配和过滤,提升系统性能。文中还提供了Python代码示例,展示了字典树在网址过滤和关键词屏蔽中的具体应用,为局域网的安全和管理提供有力支持。
50 17
|
28天前
|
运维 Shell 数据库
Python执行Shell命令并获取结果:深入解析与实战
通过以上内容,开发者可以在实际项目中灵活应用Python执行Shell命令,实现各种自动化任务,提高开发和运维效率。
56 20
|
1月前
|
数据采集 供应链 API
Python爬虫与1688图片搜索API接口:深度解析与显著收益
在电子商务领域,数据是驱动业务决策的核心。阿里巴巴旗下的1688平台作为全球领先的B2B市场,提供了丰富的API接口,特别是图片搜索API(`item_search_img`),允许开发者通过上传图片搜索相似商品。本文介绍如何结合Python爬虫技术高效利用该接口,提升搜索效率和用户体验,助力企业实现自动化商品搜索、库存管理优化、竞品监控与定价策略调整等,显著提高运营效率和市场竞争力。
89 3
|
2月前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
178 5
|
3月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
133 2
|
2月前
|
设计模式 存储 安全
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
创建型模式的主要关注点是“怎样创建对象?”,它的主要特点是"将对象的创建与使用分离”。这样可以降低系统的耦合度,使用者不需要关注对象的创建细节。创建型模式分为5种:单例模式、工厂方法模式抽象工厂式、原型模式、建造者模式。
【23种设计模式·全精解析 | 创建型模式篇】5种创建型模式的结构概述、实现、优缺点、扩展、使用场景、源码解析
|
2月前
|
存储 设计模式 算法
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析
行为型模式用于描述程序在运行时复杂的流程控制,即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务,它涉及算法与对象间职责的分配。行为型模式分为类行为模式和对象行为模式,前者采用继承机制来在类间分派行为,后者采用组合或聚合在对象间分配行为。由于组合关系或聚合关系比继承关系耦合度低,满足“合成复用原则”,所以对象行为模式比类行为模式具有更大的灵活性。 行为型模式分为: • 模板方法模式 • 策略模式 • 命令模式 • 职责链模式 • 状态模式 • 观察者模式 • 中介者模式 • 迭代器模式 • 访问者模式 • 备忘录模式 • 解释器模式
【23种设计模式·全精解析 | 行为型模式篇】11种行为型模式的结构概述、案例实现、优缺点、扩展对比、使用场景、源码解析

推荐镜像

更多