06 - python操作xml

认识XML

与HTML很像,是一种将数据存储在标记之间的标记语言,用户可以自定义自己的标记。

XML文件可以表示称为:XML树。这个XML树从根元素开始,根元素进一步分支到子元素。XML文件的每个元素都是XML树的一个节点,没有子节点的元素称为叶节点。

解析XML的两种方式

ET方式

与DOM相比,速度更快、API使用更方便直接,不会一次性读入全部文档数据,可以根据接口获取指定数据。

创建test.xml文件

<collection shelf="不知名小公司"><class departName="项目一部"><code>001</code><name>李嘉图</name></class><class departName="项目二部"><code>002</code><name>凯撒</name></class><class departName="项目三部"><code>003</code><name>楚子航</name></class>
</collection>

遍历打印所有节点

test_xml.py

# 导入ElementTree模块
import xml.etree.ElementTree as ET# 读取文件
tree = ET.ElementTree(file='test.xml')
print(type(tree))
root = tree.getroot()  
print(type(root))
print(root.tag)
print(root.attrib)# 遍历节点
for index, child in enumerate(root):print("第%s个%s元素,属性:%s" % (index, child.tag, child.attrib))for i, child_child in enumerate(child):print("标签:%s,内容:%s" % (child_child.tag, child_child.text))

运行结果

<class 'xml.etree.ElementTree.ElementTree'>
<class 'xml.etree.ElementTree.Element'>
collection
{'shelf': '不知名小公司'}
第0个class元素,属性:{'departName': '项目一部'}
标签:code,内容:001
标签:name,内容:李嘉图
第1个class元素,属性:{'departName': '项目二部'}
标签:code,内容:002
标签:name,内容:凯撒
第2个class元素,属性:{'departName': '项目三部'}
标签:code,内容:003
标签:name,内容:楚子航

获取指定标签里的数据

# 导入ElementTree模块
import xml.etree.ElementTree as ET# 读取文件
tree = ET.ElementTree(file='test.xml')
root = tree.getroot()  # 查询指定节点的信息
for elem in tree.iter(tag='name'):print(elem.tag, elem.text)

运行结果

name 李嘉图
name 凯撒
name 楚子航

DOM方式

将XML文档作为一棵树状结构,在加载XML文件加载之后,将XML文件的元素视为一个树状结构的节点,一次性将所有内容读入内存

test_xml.py

from xml.dom.minidom import parse# 读取文件
dom = parse('test.xml')# 获取文档元素对象
elem = dom.documentElement# 获取 class
class_list_obj = elem.getElementsByTagName('class')
print(class_list_obj)
print(type(class_list_obj))
for class_element in class_list_obj:# 获取标签中内容code = class_element.getElementsByTagName('code')[0].childNodes[0].nodeValuename = class_element.getElementsByTagName('name')[0].childNodes[0].nodeValueprint('code:', code, ', name:', name)

运行结果

[<DOM Element: class at 0x223b81c5450>, <DOM Element: class at 0x223b8214910>, <DOM Element: class at 0x223b8214cd0>]
<class 'xml.dom.minicompat.NodeList'>
code: 001 , name: 李嘉图
code: 002 , name: 凯撒
code: 003 , name: 楚子航

python写入XML文件

语法格式

writexml(file, indent='', addindent='', newl='', endocing=None)- file:要保存的文件对象名
- indent:根节点的缩进方式
- allindent:子节点的缩进方式
- newl:针对新行,指明换行方式
- encoding: 保存文件的编码方式

示例

test_write.py

import xml.dom.minidom# 1、在内存中创建一个空的文档
doc = xml.dom.minidom.Document()# 2、创建根元素
root = doc.createElement('collection ')
# print('添加的xml标签为:',root.tagName)# 3、设置根元素的属性
root.setAttribute('type', 'New Arrivals')# 4、将根节点添加到文档对象中
doc.appendChild(root)# 5、创建子元素
book = doc.createElement('book')# 6、添加注释
book.appendChild(doc.createComment('这是一条注释'))# 7、设置子元素的属性
book.setAttribute('语言', 'java')# 8、子元素中嵌套子元素,并添加文本节点
name = doc.createElement('name')
name.appendChild(doc.createTextNode('java基础知识'))
price = doc.createElement('价格')
price.appendChild(doc.createTextNode('999元'))
number = doc.createElement('number')
number.appendChild(doc.createTextNode('剩余10本'))# 9、将子元素添加到boot节点中
book.appendChild(name)
book.appendChild(price)
book.appendChild(number)# 10、将book节点添加到root根元素中
root.appendChild(book)# 创建子元素
book = doc.createElement('book')# 设置子元素的属性
book.setAttribute('语言', 'python')# 子元素中嵌套子元素,并添加文本节点
name = doc.createElement('name')
name.appendChild(doc.createTextNode('python基础知识'))
price = doc.createElement('价格')
price.appendChild(doc.createTextNode('888元'))
number = doc.createElement('number')
number.appendChild(doc.createTextNode('剩余20本'))#  将子元素添加到boot节点中
book.appendChild(name)
book.appendChild(price)
book.appendChild(number)# 将book节点添加到root根元素中
root.appendChild(book)print(root.toxml())fp = open('./书籍.xml', 'w', encoding='utf-8')  # 需要指定utf-8的文件编码格式,不然notepad中显示十六进制
doc.writexml(fp, indent='', addindent='\t', newl='\n', encoding='utf-8')
fp.close()

运行示例

python更新XML文件

test_add.py

import xml.dom.minidom# 打开XML文件
dom = xml.dom.minidom.parse("书籍.xml")# 创建新的书籍节点
new_book = dom.createElement("book")
new_book.setAttribute("语言", "C++")# 创建name节点
name = dom.createElement("name")
name_text = dom.createTextNode("C++基础")
name.appendChild(name_text)
new_book.appendChild(name)# 创建价格节点
price = dom.createElement("价格")
price_text = dom.createTextNode("777元")
price.appendChild(price_text)
new_book.appendChild(price)# 创建number节点
number = dom.createElement("number")
number_text = dom.createTextNode("剩余30本")
number.appendChild(number_text)
new_book.appendChild(number)# 将新的书籍节点添加到根节点下
root = dom.documentElement
root.appendChild(new_book)# 需要指定utf-8的文件编码格式,不然notepad中显示十六进制
fp = open('./书籍.xml', 'w', encoding='utf-8')  
dom.writexml(fp, indent='', addindent='\t', newl='\n', encoding='utf-8')
fp.close()

运行结果

但是不知道为啥,前面的格式乱了,后续再看看是什么原因导致的。

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

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

相关文章

Flink实战五_直播礼物统计

接上文&#xff1a;Flink实战四_TableAPI&SQL 1、需求背景 现在网络直播平台非常火爆&#xff0c;在斗鱼这样的网络直播间&#xff0c;经常可以看到这样的总榜排名&#xff0c;体现了主播的人气值。 人气值计算规则&#xff1a;用户发送1条弹幕互动&#xff0c;赠送1个荧…

在线JSON转SQL工具

在线JSON转SQL - BTool在线工具软件&#xff0c;为开发者提供方便。在线JSON转SQL工具可以将JSON文件中的数据或者JSON对象转换为SQL插入语句&#xff0c;方便用户将数据导入到数据库中。用户可以通过简单的界面上传JSON文件&#xff0c;或者文本框输入&#xff0c;点击JSON转S…

Redis——SpringBoot整合Redis实战

1、基本配置 1.1、引入依赖 首先&#xff0c;建立Maven项目&#xff0c;在Maven项目中引入pom.xml文件&#xff1a; <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> &l…

计算机网络_1.6.3 计算机网络体系结构分层思想举例

1.6.3 计算机网络体系结构分层思想举例 1、实例引入&#xff08;用户在主机中使用浏览器访问web服务器&#xff09;2、从五层原理体系结构的角度研究该实例3、练习题 笔记来源&#xff1a; B站 《深入浅出计算机网络》课程 本节通过一个常见的网络应用实例&#xff0c;来介绍计…

灵活应对:策略模式在软件设计中的应用

策略模式是一种行为型设计模式&#xff0c;它允许定义一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以互换使用。策略模式让算法的变化独立于使用算法的客户端&#xff0c;使得在不修改原有代码的情况下切换或扩展新的算法成为可能。 使用策略模式的场景包…

android inset 管理

目录 简介 Insets管理架构 Insets相关类图 app侧的类 WMS侧的类 inset show的流程 接口 流程 WMS侧确定InsetsSourceControl的流程 两个问题 窗口显示时不改变现有的inset状态 全屏窗口上的dialog 不显示statusbar问题 View 和 DecorView 设置insets信息 输入法显…

幻兽帕鲁客户端存档文件 - 云上备份和恢复教程

本文将详细介绍如何将幻兽帕鲁游戏客户端的存档文件备份至云端&#xff0c;以及如何从云端恢复存档数据至本地。 一、游戏存档备份场景 幻兽帕鲁的游戏进度存储在电脑本地磁盘上&#xff0c;游戏中创建的每个世界都对应一个本地存档文件夹。在玩游戏过程中&#xff0c;客户端…

智能边缘计算网关实现高效数据处理与实时响应-天拓四方

在当今时代&#xff0c;数据已经成为驱动业务决策的关键因素。然而&#xff0c;传统的数据处理方式往往存在延迟&#xff0c;无法满足实时性要求。此时&#xff0c;智能边缘计算网关应运而生&#xff0c;它能够将数据处理和分析的能力从中心服务器转移至设备边缘&#xff0c;大…

基于单片机控制的智能门锁设计

摘要&#xff1a;阐述基于STC15F2K60S2单片机控制的智能门锁设计&#xff0c;包括CPU控制单元模块、液晶显示LCD、 Wi-Fi模块&#xff0c;实现远程控制开门&#xff0c;密码开门的智能化功能。 关键词&#xff1a;控制技术&#xff0c;单片机&#xff0c;智能门锁&#xff0c;…

游戏视频录制软件推荐,打造专业电竞视频(3款)

随着游戏产业的快速发展&#xff0c;越来越多的玩家开始关注游戏视频录制软件。一款好的录制软件不仅可以帮助玩家记录游戏中的精彩瞬间&#xff0c;还可以让其与他人分享自己的游戏体验。接下来&#xff0c;我们将介绍三款热门的游戏视频录制软件&#xff0c;并对其进行详细的…

收放卷转动线速度计算FC(SCL+梯形图代码)

这篇博客是收放控制算法的基础系列,通过这篇文章的学习。大家能更好的理解收放卷控制里的前馈量计算,收放卷前馈PID大家可以参考下面链接文章: https://rxxw-control.blog.csdn.net/article/details/129352629https://rxxw-control.blog.csdn.net/article/details/12935262…

3D Line Mapping Revisited论文阅读

1. 代码地址 GitHub - cvg/limap: A toolbox for mapping and localization with line features. 2. 项目主页 3D Line Mapping Revisited 3. 摘要 提出了一种基于线的重建算法&#xff0c;Limap&#xff0c;可以从多视图图像中构建3D线地图&#xff0c;通过线三角化、精心…

06、全文检索 -- Solr -- Solr 全文检索之在图形界面管理 Core 的 Schema(演示对 普通字段、动态字段、拷贝字段 的添加和删除)

目录 Solr 全文检索之管理 Schema使用Web控制台管理Core的Schema3 种 字段解释&#xff1a;Field&#xff1a;普通字段Dynamic Field&#xff1a;动态字段Copy Field&#xff1a;拷贝字段 演示&#xff1a;添加 普通字段&#xff08; Field &#xff09;演示&#xff1a;添加 动…

C++入门的基础

幸福比傲慢更容易蒙住人的眼睛。 ——大仲马 C入门 1、属于C的关键字1、1、C从何而来1、2、C关键字(C98) 2、命名空间2、1、命名空间的定义2、2、命名空间使用 3、C输入和输出4、缺省参数4、1、缺省参数概念4、2、缺省参数分类 5、函数重载5、1、函数重载概念 6、引用6、1、引用…

电脑/机顶盒/ps3/4/连接老电视(只有AV、S-Video接口)解决方案之HDMI转AV/S-Video转换器HAV

HDMI转AV/S-Video转换器功能 01、将HDMI高清信号经过视频处理转换成AV、S-VIDEO(PAL/NTSC)的视频信号输出 02、将HDMI数字音频&#xff0c;经过DAC数模芯片处理转成模拟立体声输出 03、采用先进的视频处理技术&#xff0c;对图像的亮度&#xff0c;对比度及色彩进行增强处理 04…

使用Docker本地部署Jupyter Notebook并结合内网穿透实现远程访问

文章目录 1. 选择与拉取镜像2. 创建容器3. 访问Jupyter工作台4. 远程访问Jupyter工作台4.1 内网穿透工具安装4.2 创建远程连接公网地址4.3 使用固定二级子域名地址远程访问 本文主要介绍如何在Ubuntu系统中使用Docker本地部署Jupyter Notebook&#xff0c;并结合cpolar内网穿透…

01-操作系统_名词_文件下载_反弹

操作系统_名词_文件下载_反弹 一、渗透测试1.1、POC、EXP、Payload与Shellcode1.2、后门1.3、木马1.4、反弹1.5、回显1.6、跳板1.7、黑白盒测试1.8、暴力破解1.9、社会工程学1.10、撞库1.11、ATT&CK 二、案例演示2.1、基础案例1&#xff1a;操作系统-用途&命令&权限…

Android学习之路(27) ProGuard,混淆,R8优化

前言 使用java编写的源代码编译后生成了对于的class文件&#xff0c;但是class文件是一个非常标准的文件&#xff0c;市面上很多软件都可以对class文件进行反编译&#xff0c;为了我们app的安全性&#xff0c;就需要使用到Android代码混淆这一功能。 针对 Java 的混淆&#x…

【Docker】Docker Registry(镜像仓库)

文章目录 一、什么是 Docker Registry二、镜像仓库分类三、镜像仓库工作机制四、常用的镜像仓库五、常用命令镜像仓库命令镜像命令(部分)容器命令(部分) 六、docker镜像仓库实战综合实战一&#xff1a;搭建一个 nginx 服务综合实战二&#xff1a;Docker hub上创建自己私有仓库综…

B站课程评分

Spring6 https://www.bilibili.com/video/BV1Ft4y1g7Fb/ 评价: 推荐一看 配套文档优秀, 老师口齿清晰, 条理不错. mybatis https://www.bilibili.com/video/BV1JP4y1Z73S/?spm_id_from333.337.search-card.all.click 评价: 推荐一看 配套文档优秀, 老师口齿清晰, 条理不错…