xml的学习和使用python解析读取xml文件_python读取xml文件-程序员宅基地

技术标签: xml  

1. XML的介绍

XML 指可扩展标记语言(EXtensible Markup Language)。

和json类似也是用于存储和传输数据,还可以用作配置文件。

类似于HTML超文本标记语言,但是HTML所有的标签都是预定义的,而xml的标签是自行定义。

XML 和 HTML 为不同的目的而设计,HTML 旨在显示信息,而 XML 旨在传输信息。:

XML 被设计用来传输和存储数据,其焦点是数据的内容。
HTML 被设计用来显示数据,其焦点是数据的外观。

所以对 XML 最好的描述是:

XML 是独立于软件和硬件的信息传输工具。

2.XML的树结构

XML 元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。 

每一个元素有三个属性:tag、text、attrib

比如下面例子中,note是根元素,他的tag就是note,attrib属性是id=1,没有文本节点,有四个子元素。

<?xml version="1.0" encoding="UTF-8"?>
<note id="1>
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
</note>

第一行是 XML 声明。它定义 XML 的版本(1.0)和所使用的编码(UTF-8 : 万国码, 可显示各种语言)。

第二行描述文档的根元素(像在说:"本文档是一个便签")

接下来 4 行描述根的 4 个子元素(to, from, heading 以及 body),子元素只有文本内容,<note>元素拥有属性和元素内容。

最后一行定义根元素的结尾:</note>

父、子以及同胞等术语用于描述元素之间的关系。父元素拥有子元素。相同层级上的子元素成为同胞。所有的元素都可以有文本内容和属性(类似 HTML 中)。

3.XML语法 

在 HTML 中,某些元素不必有一个关闭标签;在 XML 中,省略关闭标签是非法的。所有元素都必须有关闭标签。

在 XML 中,XML 的属性值必须加引号。

<note date="12/11/2007">
<to>Tove</to>
<from>Jani</from>
</note>

在 HTML 中,常会看到没有正确嵌套的元素;在 XML 中,所有元素都必须彼此正确地嵌套。

<b><i>This text is bold and italic</i></b> 正确
<b><i>This text is bold and italic</b></i> 错误

XML 中的注释:<!-- This is a comment -->

4.XML DOM

DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法,把 XML 文档作为树结构来查看。

所有元素可以通过 DOM 树来访问。可以修改或删除它们的内容,并创建新的元素。元素,它们的文本,以及它们的属性,都被认为是节点。

4.1python解析xml例子:

<?xml version="1.0" encoding="utf-8" ?>
<!--this is a test about xml.-->
<booklist type="science and engineering">
 <book category="math">
	 <title>learning math</title>
	 <author>张三</author>
	 <pageNumber>561</pageNumber>
 </book>
 <book category="Python">
	 <title>learning Python</title>
	 <author>李四</author>
	 <pageNumber>600</pageNumber>
 </book>
</booklist>

使用python脚本读取代码:

import os
from xml.dom.minidom import parse

xml_file = r'D:\pythonProject\xml\book.xml'

    # print(xml_file)
#获取 xml 文档对象
domTree = parse(xml_file)
#获得根节点
rootNode = domTree.documentElement

# print('显示xml文档内容')
# print(rootNode.toxml())
# print('*'*10)

#判断根节点是否有属性
if rootNode.hasAttribute('type'):
    print('根节点的的type属性为:',rootNode.getAttribute('type'))
else:
    print('根节点没有属性')

book=rootNode.getElementsByTagName('book')
print('有%d个book节点'%len(book))

print(rootNode.getElementsByTagName('title')[0].childNodes[0].nodeValue)
print("rootNode.getElementsByTagName('title')[0] 是获取文档第一个title元素")
print("childNodes[0]是‘title'元素的第一个子元素,也就是文本节点")
print("nodeValue为获取节点的值")

print('*'*10)

for i in range(len(book)):
    print('\n显示第%d个book节点的内容:'%(i+1))
    print(rootNode.getElementsByTagName('book')[i].toxml())
    print()
    if rootNode.getElementsByTagName('book')[i].hasAttribute('category'):
            print('book节点的属性是:',book[i].getAttribute('category'))
        
    print('title的值:',book[i].getElementsByTagName('title')[0].childNodes[0].data)
    #从根节点写是print(rootNode.getElementsByTagName('book')[1].getElementsByTagName('title')[0].childNodes[0].data)
    
    print('author的值:',book[i].getElementsByTagName('author')[0].childNodes[0].data)
    #或者用childNodes[0].nodeValue
    # print('author的值:', book[i].getElementsByTagName('author')[0].childNodes[0].nodeValue)
    
    print('pageNumber的值:',book[i].getElementsByTagName('pageNumber')[0].childNodes[0].data)
    print('*' * 10)

运行结果:

 其中需要注意的是即使 XML 文件只包含一个元素,也必须指定数组索引 [0]。这是因为getElementsByTagName() 方法返回的是一个数组。

4.2python创建xml例子

doc.writexml():生成xml文档,将创建的存在于内存中的xml文档写入本地硬盘中,这时才能看到新建的xml文档

语法:
writexml(file,indent=’’,addindent=’’,newl=’’,endocing=None)

参数说明:
file:要保存为的文件对象名
indent:根节点的缩进方式
allindent:子节点的缩进方式
newl:针对新行,指明换行方式
encoding:保存文件的编码方式

import xml.dom.minidom

#在内存中创建一个空的文档
doc=xml.dom.minidom.Document()

#创建根元素
root=doc.createElement('booklist')
# print('添加的xml标签为:',root.tagName)

#设置根元素的属性
root.setAttribute('type','science and engineering')

#将根节点添加到文档对象中
doc.appendChild(root)

#创建子元素
book=doc.createElement('book')
#添加注释
book.appendChild(doc.createComment('这是注释'))

#设置子元素的属性
book.setAttribute('category','math')

#子元素中嵌套子元素,并添加文本节点
title=doc.createElement('title')
title.appendChild(doc.createTextNode('learning math'))
author=doc.createElement('author')
author.appendChild(doc.createTextNode('张三'))
pageNumber=doc.createElement('pageNumber')
pageNumber.appendChild(doc.createTextNode('561'))

#将子元素添加到boot节点中
book.appendChild(title)
book.appendChild(author)
book.appendChild(pageNumber)
#将book节点添加到root根元素中
root.appendChild(book)

#创建子元素
book=doc.createElement('book')
#设置子元素的属性
book.setAttribute('category','python')

title=doc.createElement('title')
title.appendChild(doc.createTextNode('learning python'))

author=doc.createElement('author')
author.appendChild(doc.createTextNode('李四'))
pageNumber=doc.createElement('pageNumber')
pageNumber.appendChild(doc.createTextNode('600'))

#将子元素添加到boot节点中
book.appendChild(title)
book.appendChild(author)
book.appendChild(pageNumber)
#将book节点添加到root根元素中
root.appendChild(book)

print(root.toxml())

fp= open(r'D:\pythonProject\xml\new.xml','w',encoding='utf-8')#需要指定utf-8的文件编码格式,不然notepad中显示十六进制
doc.writexml(fp,indent='',addindent='\t',newl='\n',encoding='utf-8')
fp.close()

运行显示结果:

 4.3向xml中插入新的子元素

import os
import xml.dom.minidom

from xml.dom.minidom import parse

#对book.xml新增一个子元素english,并删除math元素
xml_file = r'D:\pythonProject\xml\book.xml'

# #拿到根节点
domTree = parse(xml_file)
rootNode = domTree.documentElement

rootNode.removeChild(rootNode.getElementsByTagName('book')[0])

print(rootNode.toxml())

#在内存中创建一个空的文档
doc=xml.dom.minidom.Document()

book=doc.createElement('book')
book.setAttribute('category','english')
title=doc.createElement('title')
title.appendChild(doc.createTextNode('learning english'))
author=doc.createElement('author')
author.appendChild(doc.createTextNode('王五'))
pageNumber=doc.createElement('pageNumber')
pageNumber.appendChild(doc.createTextNode('328'))

book.appendChild(title)
book.appendChild(author)
book.appendChild(pageNumber)

math_book=rootNode.getElementsByTagName('book')[0]

#insertBefore方法  父节点.insertBefore(新节点,父节点中的子节点)
rootNode.insertBefore(book,math_book)
#appendChild将新产生的子元素在最后插入
# rootNode.appendChild(book)

print(rootNode.toxml())

with open(xml_file,'w',encoding='utf-8') as fh:
    domTree.writexml(fh,indent='',addindent='\t',newl='',encoding='utf-8')

 运行后显示效果:

我上传的代码链接:

Python解析创建xml文件的代码https://download.csdn.net/download/wjzholmes/71956966icon-default.png?t=M7J4https://download.csdn.net/download/wjzholmes/71956966

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/wjzholmes/article/details/121920698

智能推荐

详解音视频直播平台软件开发中的低延时-程序员宅基地

文章浏览阅读427次。详解音视频直播平台软件开发中的低延时音视频实时通讯的应用场景已经随处可见,从“吃鸡”的语音对讲、直播连麦、直播答题组队开黑,再到银行视频开户等。对于开发者来讲,除了关注如何能快速实现不同应用场景重点额音视频通讯,另一个更需要关注的可能就是“低延时”。但是,到底实时音视频传输延时应该如何“低”,才能满足你的应用场景呢?延时的产生与优化在聊低延时之前,我们先要讲清延时是如何产生的。由于音视频的传输路径一样,我们可以通过一张图来说明延时的产生:在音视频传输过程中,在不同阶段都...

网络精英赛模拟练习(5)_在企业网络安全应急响应过程中,对当前网络安全情况进行评估时,可以使用()等方法。-程序员宅基地

文章浏览阅读2.3k次,点赞3次,收藏18次。1、作为全方位的、整体的信息安全防范体系是分层次的,以下关于企业信息系统层次划分的描述,错误的是_________(单选题,1分)A.越接近内部的网络安全要求等级越低,越接近外部的网络安全要求等级越高B.业务专用网是企业为了特殊工作需要而建造的专用网络C.互联网区域用于日常的互联网业务,安全防护等级要求最低D.企业内网是企业的核心网络,拥有最高的安全防护等级回答正确(得分: 1分)正确答案A解析暂无解析2、信息安全风险评估是信息系统安全工程的重要组成部分,以下数据的操作与安_在企业网络安全应急响应过程中,对当前网络安全情况进行评估时,可以使用()等方法。

无敌破坏王2之大闹互联网观后感_拉尔夫网络观后感-程序员宅基地

文章浏览阅读5.4k次。因为同事要离职的缘故,而且我们平时又玩的很好,所以决定今天晚上请去看电影,电影院中毒液和无名之辈又都看过,而无敌破坏王的口碑还不错,所以就问是否想看这部电影,结果一拍即合,我和高工两个人陪他去看了这场动画电影。依然是美轮美奂的电影,拉尔夫这个无敌破坏王依然有着第一季中的个性,云泥洛普依然调皮可爱,生动活泼。第一季中由于拉尔夫总是不断的破坏城堡导致自己不能受到同伴们的喜爱而悲伤低落,想要像阿修一样..._拉尔夫网络观后感

c++ 学习中遇到的问题: error C2065: 'ifstream' : undeclared identifier_ifstream undeclared-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏4次。出现这个错误有两种可能:1. 没有包含文件流类的头文件 #include2. 没有使用命名空间 using namespace std 或者 std::ifstream#include #include using namespace std;int main(){ifstream infile("C:\\Users\\Administrat_ifstream undeclared

Python中的eval函数_real signature unknown-程序员宅基地

文章浏览阅读1.1w次,点赞9次,收藏12次。代码版本:3.6.3 文档:3.6.6eval() eval()是Python内置函数,点进去是这样的def eval(*args, **kwargs): # real signature unknown """ Evaluate the given source in the context of globals and locals. Th..._real signature unknown

Ubuntu Samba Server_2019 server wsllaunchinteractive /usr/sbin/adduser-程序员宅基地

文章浏览阅读979次。## Sample configuration file for the Samba suite for Debian GNU/Linux.### This is the main Samba configuration file. You should read the# smb.conf(5) manual page in order to understand the option_2019 server wsllaunchinteractive /usr/sbin/adduser --quiet --gecos failed wi

随便推点

iptables防火墙_iptables -t nat-程序员宅基地

文章浏览阅读1.1k次。IP信息包过滤系统,它实际上由两个组件 netfilter_和 iptables组成。主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理。iptables的作用是为包过滤机制的实现提供规则,通过各种不同的规则,告诉netfilter对来自某些源,前往某些目的或具有某些协议特征的数据包应该如何处理,为了更加方便的组织和管理防火墙规则。iptables采用了表和链的分层结构,所以它会对请求的数据包的包头数据进行分析,根据我们预先设定的规则进行匹配来决定是否可以进入主机。_iptables -t nat

sql级联删除_plsql 两表 级联删除-程序员宅基地

文章浏览阅读905次。sql级联删除功能:在删除主表时,自动删除副表(外键约束)相应内容删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。如:create database tempgouse tempgocreate table UserInfo(UserId int id_plsql 两表 级联删除

c语言常用的运行速度优化方法,嵌入式C语言性能优化方法-程序员宅基地

文章浏览阅读1.2k次。嵌入式C语言性能优化方法嵌入式系统是指完成一种或几种特定功能的计算机系统,具有自动化程度高,响应速度快等优点,目前已广泛应用于消费电子,工业控制等领域.嵌入式系统受其使用的硬件以及运行环境的限制,非常注重代码的时间和空间效率,因此选择一种合适的开发语言十分重要.嵌入式C语言性能优化方法有哪些?下面是相关的知识,欢迎阅读。使用宏定义在C语言中,宏是产生内嵌代码的唯一方法。对于嵌入式系统而言,为了能达..._c语言编程之运行速度优化方法汇总

复活的 C4C Linux 发行版_linux版本复活-程序员宅基地

文章浏览阅读97次。导读 Computers4Christians 项目以定制发行版的形式进行了改革,该发行版为有基督教信仰的人提供了软件。当我刚开始在这里写作时,我介绍了一个 基督徒的Linux发行版,距离现在已经有 6 个年头了,让我们来速览一下这个项目在 6 年的时间里都有哪些变化吧。 Computers4Christians 项目以定制发行版的形式进行了改革,该发行版为有基督教信仰的人提供了软件。当我刚开始在这里写作时,我介绍了一个 基督徒的 Linux 发行版,距离现在已经有 6 个年头了,让.._linux版本复活

RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2->新增记录SQL执行过程-程序员宅基地

文章浏览阅读57次。有时我们需要记录整个系统运行的SQL以作分析,特别是在上线前这对我们做内部测试也非常有帮助,当然记录SQL的方法有很多,也可以使用三方的组件。3.2版本我们在框架底层新增了记录框架运行的所有SQl过程保存到用户指定的地方以便分析查看,只需要在配置文件把配置项”LogSQL”设置为True即可。框架会自动记录各常用数据库如:Oracle、SqlServer..._rdi指令 执行sql

如何查看主板的型号和名称-程序员宅基地

文章浏览阅读1.9k次。 电脑刚开机时第一屏,找到HOME键右上角的Pause Break键按下,电脑屏幕会暂停 ,找到屏幕最下边显示的一行就有主板的型号和名称。 下面我讲讲主板选购四大盲点: 对于电脑来说,主板上承载着电脑中最重要的元件,它的重要性是不言而喻的,同时,主板也是各大厂商竞争的舞台——放眼当今主板市场,各大厂商竞相登台,各种型号相继亮相。面对如此热闹的市场,你是否对主板的选购感觉到有一些说不出来的盲..._怎么查看主板型号和品牌

推荐文章

热门文章

相关标签