Python 如何创建和解析 XML 文件

news2024/12/24 10:53:39

XML(可扩展标记语言)是一种广泛使用的标记语言,主要用于存储和传输数据。它具有结构化、层次化的特点,常被用作数据交换格式。Python 提供了多种工具和库来处理 XML 文件,包括创建、解析和操作 XML 文档。

一、XML 简介

XML 是一种用于描述结构化数据的标记语言,其设计目的是让人和机器都可以轻松读取和处理数据。一个典型的 XML 文件由多个嵌套的元素组成,每个元素都有一个开始标签和一个结束标签,中间包含数据或其他元素。

例如,一个简单的 XML 文件可能是这样的:

<bookstore>
    <book>
        <title>Python Programming</title>
        <author>John Doe</author>
        <price>29.99</price>
    </book>
    <book>
        <title>Learning XML</title>
        <author>Jane Doe</author>
        <price>39.95</price>
    </book>
</bookstore>

在这个示例中,<bookstore> 是根元素,它包含了两个 <book> 元素,每个 <book> 元素包含三个子元素:<title><author><price>

二、在 Python 中创建 XML 文件

Python 提供了多种方法来创建 XML 文件,常用的方法包括使用 xml.etree.ElementTree 模块和 minidom 模块。

1. 使用 xml.etree.ElementTree 创建 XML 文件

xml.etree.ElementTree 是 Python 标准库中的一个模块,用于生成和解析 XML。我们可以使用它轻松创建一个 XML 文档。

以下是一个使用 ElementTree 创建 XML 文件的示例:

import xml.etree.ElementTree as ET

# 创建根元素
root = ET.Element("bookstore")

# 创建第一个书籍元素
book1 = ET.SubElement(root, "book")
title1 = ET.SubElement(book1, "title")
title1.text = "Python Programming"
author1 = ET.SubElement(book1, "author")
author1.text = "John Doe"
price1 = ET.SubElement(book1, "price")
price1.text = "29.99"

# 创建第二个书籍元素
book2 = ET.SubElement(root, "book")
title2 = ET.SubElement(book2, "title")
title2.text = "Learning XML"
author2 = ET.SubElement(book2, "author")
author2.text = "Jane Doe"
price2 = ET.SubElement(book2, "price")
price2.text = "39.95"

# 创建 XML 树结构
tree = ET.ElementTree(root)

# 将 XML 树写入文件
tree.write("bookstore.xml", encoding="utf-8", xml_declaration=True)

在这个示例中,我们首先创建了一个根元素 <bookstore>,然后为每本书创建了一个 <book> 元素,并为每本书添加了 <title><author><price> 子元素。最后,我们使用 ElementTree.write 方法将 XML 树保存到文件中。

2. 使用 minidom 创建 XML 文件

minidom 是一个用于处理 XML 的轻量级 DOM 实现,可以让我们更灵活地操作 XML 文档。

以下是一个使用 minidom 创建 XML 文件的示例:

from xml.dom.minidom import Document

# 创建文档对象
doc = Document()

# 创建根元素
root = doc.createElement("bookstore")
doc.appendChild(root)

# 创建第一个书籍元素
book1 = doc.createElement("book")
root.appendChild(book1)

title1 = doc.createElement("title")
title1.appendChild(doc.createTextNode("Python Programming"))
book1.appendChild(title1)

author1 = doc.createElement("author")
author1.appendChild(doc.createTextNode("John Doe"))
book1.appendChild(author1)

price1 = doc.createElement("price")
price1.appendChild(doc.createTextNode("29.99"))
book1.appendChild(price1)

# 创建第二个书籍元素
book2 = doc.createElement("book")
root.appendChild(book2)

title2 = doc.createElement("title")
title2.appendChild(doc.createTextNode("Learning XML"))
book2.appendChild(title2)

author2 = doc.createElement("author")
author2.appendChild(doc.createTextNode("Jane Doe"))
book2.appendChild(author2)

price2 = doc.createElement("price")
price2.appendChild(doc.createTextNode("39.95"))
book2.appendChild(price2)

# 将 XML 文档写入文件
with open("bookstore_minidom.xml", "w", encoding="utf-8") as f:
    f.write(doc.toprettyxml(indent="  "))

在这个示例中,我们使用 minidom 来创建 XML 文档。与 ElementTree 相比,minidom 提供了更多的控制,可以方便地格式化输出(如缩进和换行)。

三、在 Python 中解析 XML 文件

解析 XML 文件是指读取 XML 文件并提取所需数据。Python 提供了多种方法来解析 XML 文件,包括 xml.etree.ElementTreeminidom 以及 xml.sax 等模块。

1. 使用 xml.etree.ElementTree 解析 XML 文件

ElementTree 模块不仅可以创建 XML 文件,还可以用来解析 XML 文件。以下是一个简单的解析示例:

import xml.etree.ElementTree as ET

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

# 遍历根元素的子元素
for book in root.findall('book'):
    title = book.find('title').text
    author = book.find('author').text
    price = book.find('price').text
    
    print(f"Title: {title}, Author: {author}, Price: {price}")

在这个示例中,我们使用 ElementTree.parse 方法解析 XML 文件,并通过 getroot 方法获取根元素。接着,我们使用 findall 方法遍历所有的 <book> 元素,并提取其中的 <title><author><price> 元素的文本内容。

2. 使用 minidom 解析 XML 文件

minidom 模块也可以用来解析 XML 文件。以下是一个示例:

from xml.dom.minidom import parse

# 解析 XML 文件
doc = parse('bookstore_minidom.xml')

# 获取所有的书籍元素
books = doc.getElementsByTagName("book")

# 遍历每本书
for book in books:
    title = book.getElementsByTagName("title")[0].childNodes[0].data
    author = book.getElementsByTagName("author")[0].childNodes[0].data
    price = book.getElementsByTagName("price")[0].childNodes[0].data
    
    print(f"Title: {title}, Author: {author}, Price: {price}")

在这个示例中,我们使用 minidom.parse 方法解析 XML 文件,并使用 getElementsByTagName 方法获取所有的 <book> 元素。然后,我们从每个 <book> 元素中提取出 <title><author><price> 元素的文本内容。

3. 使用 xml.sax 解析 XML 文件

xml.sax 是 Python 中处理 XML 的另一种方式,它是基于事件驱动的解析方式,适合处理大型 XML 文件。sax 的工作原理是通过事件(如开始元素、结束元素、字符数据等)来解析 XML。

以下是一个使用 xml.sax 解析 XML 文件的示例:

import xml.sax

class BookHandler(xml.sax.ContentHandler):
    def __init__(self):
        self.currentData = ""
        self.title = ""
        self.author = ""
        self.price = ""

    # 元素开始事件处理
    def startElement(self, tag, attributes):
        self.currentData = tag

    # 元素结束事件处理
    def endElement(self, tag):
        if self.currentData == "title":
            print(f"Title: {self.title}")
        elif self.currentData == "author":
            print(f"Author: {self.author}")
        elif self.currentData == "price":
            print(f"Price: {self.price}")
        self.currentData = ""

    # 内容事件处理
    def characters(self, content):
        if self.currentData == "title":
            self.title = content
        elif self.currentData == "author":
            self.author = content
        elif self.currentData == "price":
            self.price = content

# 创建一个 XMLReader
parser = xml.sax.make_parser()

# 关闭命名空间
parser.setFeature(xml.sax.handler.feature_namespaces, 0)

# 重写 ContentHandler
Handler = BookHandler()
parser.setContentHandler(Handler)

parser.parse("bookstore.xml")

在这个示例中,我们定义了一个 BookHandler 类,它继承自 xml.sax.ContentHandler。这个类中包含了三个主要的方法:startElementendElementcharacters,它们分别在元素开始、元素结束和处理元素内容时被调用。通过 xml.sax.make_parser 创建解析器并设置内容处理器后,可以使用 parser.parse 方法来解析 XML 文件。

在 Python 中处理 XML 文件有多种方法,包括 xml.etree.ElementTreeminidomxml.sax 等。这些方法各有优劣,ElementTreeminidom 更适合小型 XML 文档的创建和解析,而 xml.sax 则适合处理大型 XML 文档。通过这些工具,可以方便地创建、读取和操作 XML 文件,为数据的存储和交换提供了有力的支持。

在实际应用中,选择合适的工具取决于具体的需求和场景。例如,如果需要快速创建和解析 XML 文件,ElementTree 是一个很好的选择;如果需要处理大型 XML 文件,xml.sax 可能更为合适。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2047837.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费webp转jpeg或gif工具

1、”“添加webp文件&#xff1b;”-“移除webp文件&#xff1b;”>>“开始转换&#xff1b;”X“清空内容。 也可以把想要转换的文件全选&#xff0c;拖进窗口里。 2、默认将webp文件转换成同名的png文件放在原来的文件夹里。如果不是静态图片&#xff0c;则自动尝试转…

案例:ZooKeeper + Kafka消息队列集群部署

目录 消息队列 概念 使用场景 不适宜 适宜 消息队列的特征 存储 异步 异步的优点 同步 为什么需要消息队列 解耦 作用 冗余 扩展性 灵活性 峰值处理能力 可恢复性 顺序保证 Kafka 概念 Kafka技术名词 &#xff08;1&#xff09;Broker &#xff08;2&a…

基于Orangepi全志H616智能视觉垃圾分类系统

目录 一、功能需求 二、Python的安装和环境搭建 三、Python基础 3.1 Python的特点&#xff1a; 3.2 Python的基础学习&#xff1a; 3.3 字典的多层嵌套&#xff1a; 四、C语言调用Python 4.1 搭建编译环境&#xff1a; 4.2 C语言执行Python语句&#xff1a; 4.3 C语言…

22 注意力机制—Transformer

目录 TransformerTransformer 架构对比 seq2seq多头注意力(Multi-head attention)带掩码的多头注意力(Masked Multi-head attention)基于位置的前馈网络(Positionwise FFN)残差连接和归一化(Add & norm)(加 & 规范化)1、加入归一化能够更好地训练比较深的网络…

UE基础 —— 项目与模板

虚幻引擎 项目 包含游戏和应用程序的所有内容&#xff0c;并将所有内容联系在一起&#xff1b;包含磁盘上的许多文件夹和资产&#xff0c;如蓝图、材质、3D资产、动画等&#xff1b;内容浏览器与磁盘上的文件夹和文件夹结构相同&#xff1b; 每个项目都有与之关联的.uproject文…

性能优化理论篇 | 彻底弄懂系统平均负载

Linux 上的进程状态 要讨论系统平均负载&#xff0c;首先要了解Linux 上的进程状态。 标志名称内核名称及解释R运行中或可运行TASK_RUNNING。进程正在执行或等待执行。可以在用户空间&#xff08;用户代码&#xff09;或内核空间&#xff08;内核代码&#xff09;中运行。S可…

【项目】基于Vue3.2+ElementUI Plus+Vite 通用后台管理系统

构建项目 环境配置 全局安装vue脚手架 npm install -g vue/cli-init打开脚手架图形化界面 vue ui创建项目 在图形化界面创建项目根据要求填写项目相关信息选择手动配置勾选配置项目选择配置项目然后我们就搭建完成啦&#x1f973;&#xff0c;构建可能需要一点时间&#xff0…

Navicat Premium Lite For Linux,一款免费的专业可视化 SQL 数据库设计工具,支持各种数据库并行连接,在业界可是大名鼎鼎!

Navicat Premium Lite For Linux&#xff0c;一款免费的专业可视化 SQL 数据库设计工具&#xff0c;支持各种数据库并行连接&#xff0c;在业界可是大名鼎鼎&#xff01; Navicat 是一个可视化数据库、数据表设计软件&#xff0c;支持MySQL、MariaDB、SQLite、MongoDB、Redshi…

论文阅读笔记:ST-MetaNet-1

目录 前言 摘要 CCS 关键词 介绍 时空相关性的复杂组合 空间相关性 时间相关性 时空相关性的多样性 本篇博客结语 前言 读这篇论文边读边学&#xff0c;每天坚持发博客&#xff0c;看到哪学到哪&#xff0c;这系列文章既有翻译&#xff0c;又有深度详细解释&#xff…

Rust学习笔记1--下载安装和使用

一、下载和安装&#xff1a; 官网&#xff1a;https://www.rust-lang.org/ 直接下载即可&#xff0c;windows&#xff1a;按照教程执行步骤。 二、使用&#xff1a; 2.1 在vscode中安装rust 2.2 编译与运行rust文件&#xff1a; 后缀名rs&#xff1a; 编译&#xff1a; …

org.springframework.boot.autoconfigure.AutoConfiguration.imports 配置没有生效

在spring3.x以后&#xff0c;自动配置需要配置在org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件中 如果你配置了却没生效&#xff0c;有可能是创建的目录不对&#xff0c;正常情况下, META-INF.spring 是一个两层目录&#xff0c;如果是从别的地方复制…

第51集《大佛顶首楞严经》

请大家打开讲义第 111 页。癸三&#xff0c;结责迷情。 当我们在修学首楞严王三昧的时候&#xff0c;要把握两个很重要的原则&#xff1a;第一个就是它修学的方法&#xff0c;第二个就是它修学的目标。 那么&#xff0c;首楞严王的修学方法是什么呢&#xff08;这一点蕅益大师…

零基础读懂 DDPM 数学推导

零基础读懂 DDPM 数学推导 完整PDF文件可以在工坊获得&#xff0c;以下是内容截图。

为何显示keyerror fruit,如何解决??

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【docker综合篇】关于我用docker搭建了6个应用服务的事

最近一直在捣鼓docker&#xff0c;利用测试服务器&#xff0c;本着犯错就重来(重装系统)的大无畏精神&#xff0c;不断尝试&#xff0c;总结经验&#xff0c;然后在网上搜寻一些关于docker有关的服务镜像&#xff0c;并搭建起来。看着一个个服务在我的服务器跑起来&#xff0c;…

【QT】基于UDP/TCP/串口 的Ymodom通讯协议客户端

【QT】基于UDP/TCP/串口的Ymodom通讯协议客户端 前言Ymodom实现QT实现开源库的二次开发-1开源库的二次开发-2 串口方式实现TCP方式实现UDP方式实现补充&#xff1a;文件读取补充&#xff1a;QT 封装成EXE 前言 Qt 运行环境 Desktop_Qt_5_11_2_MSVC2015_64bit &#xff0c;基于…

PowerShell自动化Windows系统管理任务

​ 大家好&#xff0c;我是程序员小羊&#xff01; 前言 Windows系统管理涉及许多繁琐的任务&#xff0c;如用户管理、文件操作、系统更新、网络配置等。PowerShell作为Windows的命令行工具和脚本语言&#xff0c;可以极大地简化这些管理任务。本文将探讨如何使用PowerShell自动…

【教学类-75-01】20240817“通义万相图片最大化+透明png”的修图流程

背景需求&#xff1a; 打印了袜子配对的PDF模版&#xff0c;做预测试 【教学类-74-02】彩色袜子配对02--左右配对-CSDN博客文章浏览阅读497次&#xff0c;点赞10次&#xff0c;收藏9次。【教学类-74-02】彩色袜子配对02--左右配对https://blog.csdn.net/reasonsummer/article…

09:链表的介绍

链表 1、算法的定义2、链表 1、算法的定义 通俗的定义&#xff1a;解题的方法与步骤。       狭义的定义&#xff1a;对存储的数据的操作。       广义的定义&#xff1a;无论数据是如何存储的&#xff0c;对数据从操作都是一样的。 到目前为止我们可以通过2种结构来存储…

关于订单最终一致性解决方案

背景 整体的交易架构主要由两部分组成&#xff1a;C端交易平台 - B端交易平台 由于组织架构的特殊性&#xff0c;并没有采用两阶段提交、三阶段提交这种刚性分布式事务的方案。 主要采用了基于TCC思想的TOC柔性事务补偿方案。 柔性事务&#xff1a;遵循BASE原则&#xff0c;…