Python 如何创建和解析 XML 文件

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').textauthor = book.find('author').textprice = book.find('price').textprint(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].dataauthor = book.getElementsByTagName("author")[0].childNodes[0].dataprice = book.getElementsByTagName("price")[0].childNodes[0].dataprint(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.saxclass 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 = contentelif self.currentData == "author":self.author = contentelif 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.mzph.cn/news/877617.shtml

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

相关文章

qt-13 进度条(模态和非模态)

进度条-模态和非模态 progressdlg.hprogressdlg.cppmain.cpp运行图模态非模态 progressdlg.h #ifndef PROGRESSDLG_H #define PROGRESSDLG_H#include <QDialog> #include <QLabel> #include <QLineEdit> #include <QProgressBar> #include <QCombo…

人物形象设计:塑造独特角色的指南

引言 人物形象设计是一种创意过程&#xff0c;它利用强大的设计工具&#xff0c;通过视觉和叙述元素塑造角色的外在特征和内在性格。这种设计不仅赋予角色以生命&#xff0c;还帮助观众或读者在心理层面上与角色建立联系。人物形象设计的重要性在于它能够增强故事的吸引力和说…

p8 Run的流程和Docker原理

docker run的运行原理图 docker是怎么工作的&#xff1f; docker是一个cs的一个结构的系统docker的守护进程运行在宿主机上面通过socket进行访问 其实就是看下面的这个图&#xff0c;通过客户端的命令来操作docker的守护进程然后启动一些容器&#xff0c;默认容器是不启动的 …

网络基础概念【网络】

文章目录 网络协议协议分层 OSI七层模型TCP/IP五层&#xff08;或四层&#xff09;模型同局域网的两台主机通信数据包封装和解包分用&#xff08;数据段&#xff0c;数据报&#xff0c;数据帧&#xff09;网络中的地址管理 网络协议 协议分层 网络协议栈设计成层状结构&#…

【学习笔记】Day 20

一、进度概述 1、机器学习常识12-18&#xff0c;以及相关代码复现 二、详情 12、SVM&#xff08;support vector machines&#xff0c;支持向量机&#xff09; 实际上&#xff0c;支持向量机是一种二分类模型&#xff0c;它将实例的特征向量映射为空间中的一些点&#xff0c;…

如何将CSDN文章导出为pdf文件

第一步&#xff1a; 打开想要导出的页面&#xff0c;空白处点击鼠标右键⇒点击“检查”或“check”&#xff0c;或直接在页面按F12键。 第二步&#xff1a; 复制以下代码粘贴到控制台&#xff0c;并按回车。 若提示让输入“允许粘贴”或“allow pasting”&#xff0c;按提示…

百度地图路书实现历史轨迹回放、轨迹回放进度、聚合点、自定义弹框和实时监控视频、多路视频轮巡播放

前言 分享一个刚做完项目集成技术&#xff0c;一个车辆行驶轨迹监控、行车视频监控、对特种车辆安全监管平台&#xff0c;今年政府单位有很多监管平台项目&#xff0c;例如&#xff1a;渣土车监控、租出车监管、危害气体运输车监管等平台&#xff0c;这些平台都有车辆行驶轨迹…

Linux基础知识学习(五)

1. 用户组管理 每个用户都有一个用户组&#xff0c;系统可以对一个用户组中的所有用户进行集中管理&#xff08;开发、测试、运维、root&#xff09;。不同Linux 系统对用户组的规定有所不同&#xff0c;如Linux下的用户属于与它同名的用户组&#xff0c;这个用户组在创建用户…

QT聊天室基于Tcp

server.cpp #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget),server(new QTcpServer(this)) // 给服务器指针对象实例化空间{ui->setupUi(this); }Widget::~Widget() {delete ui; }…

音频采集spring_ws_webrtc (html采集麦克风转gb711并发送广播播放)完整案例

下载地址&#xff1a;http://www.gxcode.top/code 项目说明 springbootwebscoektwebrtc 项目通过前端webrtc采集麦克风声音&#xff0c;通过websocket发送后台&#xff0c;然后处理成g711-alaw字节数据发生给广播UDP并播放。 后台处理项目使用线程池(5个线程)接受webrtc数据并…

mac如何恢复被同名替换掉的文件夹 mac文件被替换如何恢复

Mac系统一直以高性能遥遥领先其他的Windows系统&#xff0c;因此&#xff0c;Mac虽然价格远远高出其他的笔记本电脑&#xff0c;但是还是受到了一众用户的青睐。使用mac时&#xff0c;我们也经常会将一个文件命名为已经有了相同文件的文件名&#xff0c;且保存到同一个目标地址…

MATLAB-PSO-BiTCN-BiLSTM-Attention多变量分类

一、数据集 数据特征&#xff1a;12个多分类&#xff1a;4分类 ​ 二、PSO-BiTCN-BiLSTM-Attention网络 PSO-BiTCN-BiLSTM-Attention 网络是一种结合了多种深度学习技术和优化算法的复杂模型&#xff0c;用于处理时序数据任务&#xff0c;如时间序列预测、分类或其他相关问题…

【Linux】——进程概念(万字解读)

一 冯诺依曼体系结构 在此之前&#xff0c;我们先要理解我们计算机的冯诺依曼体系结构&#xff0c;因为是进程的基础 我们所有的操作其实都是基于这样一个模型&#xff0c;比如你在qq上&#xff0c;和别人发送消息&#xff0c;这个消息肯定是先通过输入设备进行输入&#xf…

一个注解轻松搞定审计日志服务!

【审计日志】&#xff0c;简单的说就是系统需要记录谁&#xff0c;在什么时间&#xff0c;对什么数据&#xff0c;做了什么样的更改&#xff01;任何一个 IT 系统&#xff0c;如果要过审&#xff0c;这项任务基本上也是必审项&#xff01; 实现【审计日志】这个需求&#xff0…

整体思想以及取模

前言&#xff1a;一开始由于失误&#xff0c;误以为分数相加取模不能&#xff0c;但是其实是可以取模的 这个题目如果按照一般方法&#xff0c;到达每个节点再进行概率统计&#xff0c;但是不知道为什么只过了百分之十五的测试集 题目地址 附上没过关的代码 #include<bits…

联想闪电鲨移动硬盘文件没删除却消失了怎么办

在日常的数据存储与管理中&#xff0c;移动硬盘作为便携且容量可观的存储设备&#xff0c;深受用户青睐。然而&#xff0c;当您发现联想闪电鲨移动硬盘中的文件突然消失&#xff0c;而您确信并未进行删除操作时&#xff0c;这无疑会令人感到困惑与焦虑。本文旨在为您揭开这一谜…

vue-element-admin——<keep-alive>不符合预期缓存的原因

vue-element-admin——<keep-alive>不符合预期缓存的原因 本文章&#xff0c;以现在中后台开发用的非常多的开源项目vue-element-admin为案例。首先&#xff0c;列出官方文档与缓存<keep-alive>相关的链接&#xff08;请认真阅读&#xff0c;出现缓存<keep-ali…

在IEDA里打包Maven项目记录

之前在网上查找到的方式发现比较繁琐&#xff0c;所以把自己的解决办法记录一下分享给兄弟们 <plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>3.2.4</vers…

集合及数据结构第一节————初识集合框架和数据结构

系列文章目录 集合及数据结构第一节————初识集合框架和数据结构 初始集合框架和数据结构 什么是集合框架&#xff1f;集合框架的重要性背后所涉及的数据结构以及算法数据结构的基本概念和术语逻辑结构和物理结构数据类型 文章目录 系列文章目录集合及数据结构第一节——…

文件的读写(标准库函数与系统调用函数),文件描述符的复制

文件描述符 为了解决内核对象在可访问性与安全”性之间的矛盾&#xff0c;Unix系统通过所谓的文件描述符&#xff0c;将位于内核空间中的文件表项间接地提供给运行于用户空间中的程序代码。为了便于管理在系统中运行的各个进程&#xff0c;内核会维护一张存有各进程信息的列表&…