06 - python操作xml

news2024/11/26 15:41:18

认识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].nodeValue
    name = class_element.getElementsByTagName('name')[0].childNodes[0].nodeValue
    print('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.coloradmin.cn/o/1433338.html

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

相关文章

服务器和云服务器哪个更安全?

随着云计算技术的不断发展&#xff0c;越来越多的企业开始选择使用云服务器来存储和处理数据。然而&#xff0c;对于一些企业来说&#xff0c;他们可能更倾向于使用传统的服务器。在这种情况下&#xff0c;安全性成为了一个重要的考虑因素。那么&#xff0c;服务器和云服务器哪…

arm 汇编积累

C语言函数与汇编对应关系 一、MOV 系列指令 1、指令格式 MOV{条件}{S} 目的寄存器&#xff0c;源操作数 2、含义解析&#xff1a; &#xff08;1&#xff09;&#xff1a;mov 指令传送数据 案例&#xff1a; MOV R0,R1 ; R0 R1; MOV PC,R14 ;PC R14; MOV R0,R…

[Angular 基础] - 数据绑定(databinding)

[Angular 基础] - 数据绑定(databinding) 上篇笔记&#xff0c;关于 Angular 的渲染过程及组件的创建&简单学习&#xff1a;[Angular 基础] - Angular 渲染过程 & 组件的创建 Angular 之中的 databinding 是一个相对而言更加复杂&#xff0c;以及我个人觉得相对而言比…

Java on Azure Tooling 2024年1月更新|Azure Key Vault 支持、示例项目创建支持及更多

作者&#xff1a;Jialuo Gan - Program Manager, Developer Division At Microsoft 排版&#xff1a;Alan Wang 大家好&#xff0c;欢迎来到 2024 年 Java on Azure 工具的首次更新。在本次更新中&#xff0c;我们将介绍对于 Azure Key Vault 支持、基于 Azure 示例项目的创建支…

C++ 调用lua 脚本

需求&#xff1a; 使用Qt/C 调用 lua 脚本 扩展原有功能。 步骤&#xff1a; 1&#xff0c;工程中引入 头文件&#xff0c;库文件。lua二进制下载地址&#xff08;Lua Binaries&#xff09; 2&#xff0c; 调用脚本内函数。 这里调用lua 脚本中的process函数&#xff0c;并…

如何让虚拟机拥有愉快网络环境,vmware,ubuntu,centos

博客原文 文章目录 前言拥有愉快网络环境步骤:测试网关连接 Ubuntu修改 http 与 sock 代理地址修改 /etc/resolv.conf配置 apt 使用代理测试连接 Centos设置代理地址修改 NetworkManager最后重启网卡&#xff1a;测试代理 前言 相信计算机专业的同学在学习 linux 时, 一定会被无…

Element UI+Spring Boot进行CRUD的实例

ElementUI安装与使用指南 前端代码&#xff1a;点击查看learnelementuispringboot项目源码 后端代码&#xff1a;点击查看 LearnElementUiAndSpringBoot 一、前端配置 安装axios Gitee的axios介绍与使用 GitHub的axios介绍与使用 方式一&#xff1a;使用npm安装 $ npm in…

2024年最新幻兽帕鲁服务器搭建教程

玩转幻兽帕鲁服务器&#xff0c;阿里云推出新手0基础一键部署幻兽帕鲁服务器教程&#xff0c;傻瓜式一键部署&#xff0c;3分钟即可成功创建一台Palworld专属服务器&#xff0c;成本仅需26元&#xff0c;阿里云服务器网aliyunfuwuqi.com分享2024年新版基于阿里云搭建幻兽帕鲁服…

回归预测 | Matlab实现WOA-CNN-LSTM-Attention鲸鱼算法优化卷积长短期记忆网络注意力多变量回归预测(SE注意力机制)

回归预测 | Matlab实现WOA-CNN-LSTM-Attention鲸鱼算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&#xff09; 目录 回归预测 | Matlab实现WOA-CNN-LSTM-Attention鲸鱼算法优化卷积长短期记忆网络注意力多变量回归预测&#xff08;SE注意力机制&…

谷歌产品大更新:Bard可生成图像;文生音乐平台等5大免费功能

2月2日&#xff0c;谷歌在官网对生成式AI产品进行了大更新&#xff0c;包括类ChatGPT聊天助手Bard可以通过文本提示生成图像&#xff1b; 全新的文生音乐平台MusicFX&#xff1b;新的文生图像平台ImageFX&#xff1b;新的文本扩写平台TextFX&#xff1b;在谷歌地图中增加生成式…

docker搭建Mysql集群准备(一)

docker搭建Mysql集群准备 Linux基本知识&#xff1a; 修改机器 IP&#xff0c;变成静态 IP vim /etc/sysconfig/network-scripts/ifcfg-ens33 文件 TYPEEthernet PROXY_METHODnone BROWSER_ONLYno BOOTPROTOstatic IPADDR192.168.190.67 NETMASK255.255.255.0 GAT…

第六讲:文件操作

第六讲:文件操作 文件夹创建文件夹移动文件夹复制文件夹删除文件夹文件操作文件读取文件写入文件文件夹 创建文件夹 定义创建文件夹函数:chmk_path()定义一个函数 chmk_path(),这个函数的功能是创建文件夹。 首先需要导入操作系统接口模块——os 模块,这个模块中包含某些函…

802.11n 802.11ac (WiFi 4/5 )的核心要点

802.11n 802.11ac &#xff08;WiFi 4/5 &#xff09;是什么&#xff1f; WiFi 4&#xff1a; Ieee 802.11n Enhancements for High Throughput &#xff08;HT&#xff09; WiFi 5&#xff1a; Ieee 802.11ac Enhancements for Very High Throughput &#xff08;VHT&#x…

ywtool login guard命令

一.登录防护功能介绍 登录防护功能主要检查系统日志/var/log/secure&#xff0c;查看系统有没有被暴力登录。登录防护默认是检测3分钟内登录系统失败15次(次数可修改)后,视其为有攻击性,拉黑此IP(centos7通过系统文件阻止IP,centos8/9通过防火墙阻止IP)。此脚本只针对SSH访问,…

vscode 无法远程连接waiting the server log

使用版本 报错信息 相关日志 [17:32:59.765] > Waiting for server log... [17:32:59.801] > Waiting for server log... [17:32:59.831] > > * > * Visual Studio Code Server > * > * By using the software, you agree to > * the Visual Studio…

浅压缩、深压缩、双引擎、计算机屏幕编码……何去何从?

专业视听领域尤其显示控制和坐席控制领域&#xff0c;最近几年最激动人心的技术&#xff0c;莫过于分布式了。 分布式从推出之日就备受关注&#xff1a;担心稳定性的&#xff0c;质疑同步性能的&#xff0c;怀疑画面质量的…… 诚然&#xff0c;我们在此前见多了带着马赛克的…

Rust 本地文档的使用:rustup doc

Rust 是一种系统级编程语言&#xff0c;以其安全性、速度和内存控制能力而闻名。为了方便开发者更好地了解并利用 Rust 标准库和工具链中的功能&#xff0c;Rust 提供了一种内置的文档浏览方式——通过 rustup doc 命令。 安装 rustup 在查阅 Rust 文档之前&#xff0c;确保你…

Photoshop插件来了#comfyui-mixlab-ps-plugin

今天有用户向我反馈&#xff0c;提出ps是设计师最习惯的工具&#xff0c;问我可不可以开发个ps的插件&#xff1f; 我纠结了下&#xff0c;因为从来没有开发过ps插件&#xff0c;想着应该上手会比较耗时间&#xff0c;不过耗时这个问题&#xff0c;最近在用MixCopilot辅助编程&…

LabVIEW与EtherCAT实现风洞安全联锁及状态监测

LabVIEW与EtherCAT实现风洞安全联锁及状态监测 在现代风洞试验中&#xff0c;安全联锁与状态监测系统发挥着至关重要的作用&#xff0c;确保了试验过程的安全性与高效性。介绍了一套基于EtherCAT总线技术和LabVIEW软件开发的风洞安全联锁及状态监测系统。该系统通过实时、可靠…

vuecli3 执行 npm run build 打包命令报错:TypeError: file.split is not a function

问题 今天有个项目在打包的时候遇到了一个问题&#xff0c;就是执行 npm run build 命令的时候报错了&#xff0c;如下&#xff1a; 解决 我排查了一下&#xff0c;模拟代码如下&#xff1a;在打包的时候用了 MinChunkSizePlugin const webpack require("webpack"…