Python读取XML⽂件内容
XML 指的是可扩展标记语⾔(eXtensible Markup Language),和json类似也是⽤于存储和传输数据,还可以⽤作配置⽂件。类似于HTML超⽂本标记语⾔,但是HTML所有的标签都是预定义的,⽽xml的标签可以随便定义。
XML元素
指从开始标签到结束标签的部分(均包括开始和结束)
⼀个元素可以包括:
其它元素
<aa>
<bb></bb>
</aa>
属性
<a id=’132’></a>
⽂本
<a >abc</a>
混合以上所有
XML语法规则
所有的元素都必须有开始标签和结束标签,省略结束标签是⾮法的。如:
<root>根元素</root>
⼤⼩写敏感,以下是两个不同的标签
<Note>this is a test1</Note>
<note>this is a test2</note>
xml⽂档必须有根元素
<note>
<b>this is a test2</b>
<name>joy</name>
</note>
XML必须正确嵌套,⽗元素必须完全包住⼦元素。如:
<note><b>this is a test2</b></note>
XML属性值必须加引号,元素的属性值都是⼀个键值对形式。如:
<book category=" Python"></book>
注意:元素book的category属性值python必须⽤引号括起来,单引号双引号都可以。如果属性值中包含单引号那么⽤双引号括起来,如果属性值包含单引号那么外⾯⽤双引号括起来。
XML命名规则
名称可以包含字母、数字以及其他字符
名称不能以数字或标点符号开头
名称不能以字母xml或XML开始
名称不能包含空格
可以使⽤任何名称,没有保留字
滴答滴答名称应该具有描述性,简短和简单,可以同时使⽤下划线。
避免“-”、“.”、“:”等字符
Xml的注释格式
<!--注释内容-->
Python对XML的解析
常见的XML编程接⼝有DOM和SAX,这两种接⼝处理XML⽂件的⽅式不同,使⽤场合也不同。python有三种⽅法解析XML:SAX,DOM和ElementTree DOM(Document Object Model)
DOM的解析器在解析⼀个XML⽂档时,⼀次性读取整个⽂档,把⽂档中所有元素保存在内存中的⼀个树结构⾥,之后利⽤DOM提供的不同函数来读取该⽂档的内容和结构,也可以把修改过的内容写⼊XML⽂件。由于DOM是将XML读取到内存,然后解析成⼀个树,如果要处理的XML⽂本⽐较⼤的话,就会很耗内存,所以DOM⼀般偏向于处理⼀些⼩的
XML,(如配置⽂件)⽐较快。
SAX(simple API for XML)
刀郎好听的歌Python标准库中包含SAX解析器,SAX是⽤的是事件驱动模型,通过在解析XML过程
中触发⼀个个的事件并调⽤⽤户定义的回调函数来处理XML⽂件。
解析的基本过程:
读到⼀个XML开始标签,就会开始⼀个事件,然后事件就会调⽤⼀系列的函数去处理
⼀些事情,当读到⼀个结束标签时,就会触发另⼀个事件。所以,我们写XML⽂档⼊
如果有格式错误的话,解析就会出错。
这是⼀种流式处理,⼀边读⼀边解析,占⽤内存少。适⽤场景如下:
1、对⼤型⽂件进⾏处理;
2、只需要⽂件的部分内容,或者只需从⽂件中得到特定信息。
3、想建⽴⾃⼰的对象模型的时候。
ElementTree(元素树)
ElementTree就像⼀个轻量级的DOM,具有⽅便友好的API。代码可⽤性好,速度快,消耗内存少。
注:因DOM需要将XML数据映射到内存中的树,⼀是⽐较慢,⼆是⽐较耗内存,⽽SAX流式读取XML⽂件,⽐较快,占⽤内存少,但需要⽤户实现回调函数(handler)
xml.dom解析XML
本次先介绍DOM⽅式操作XML,先建⽴名为l的⽂件供后续使⽤。
<?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>
minidom.parse(parse=None,bufsie=None)
函数作⽤:使⽤parse解析器打开xml⽂档,并将其解析为DOM⽂档,也就是内存中的⼀棵树,并得到这个对象
doc.documentElement
获取xml⽂档对象,就是拿到DOM树的根
代码⽰例:
>>> from xml.dom.minidom import parse
>>> DOMTree=parse(l')
>>> type(DOMTree)
<class 'xml.dom.minidom.Document'>
>>> booklist=DOMTree.documentElement
>>> booklist
<DOM Element: booklist at 0x19c0606b340>
12月好日子返回xml的⽂档内容
>>> booklist=DOMTree.documentElement
>>> print (l())
<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>
node.lastChild
返回元素的最后⼀个⼦节点
node.firstChild
返回元素的⾸个⼦节点
代码⽰例:
>>> booklist.lastChild
>>> booklist.firstChild
getElementsByTagName(name)获取节点元素
获取xml⽂档中的某个⽗节点下具有相同节点名的节点对象的集合。返回的是list
代码⽰例:
from xml.dom.minidom import parse
#minidom解析器打开xml⽂档并将其解析为内存中的⼀棵树
DOMTree=parse(l')
#获取xml⽂档对象,就是拿到树的根
booklist=DOMTree.documentElement
#获取booklist对象中所有book节点的list集合
ElementsByTagName('book')
print(books)
print (type(books))
print(books)
print('有%d个book节点'%len(books))
print('*'*40)
print('第⼀个book节点%s'%ElementsByTagName('book')[0])
print('*'*40)
print('第⼀个book节点节点内容%s'%ElementsByTagName('book')[0].toxml()) print('*'*40)
print('第⼀个title节点%s'%ElementsByTagName('title')[0].toxml())
hasAttribute(name)判断是否包含属性值
代码⽰例:
from xml.dom.minidom import parse
print('DOM树的根对象:',booklist)
if booklist.hasAttribute('type'):
#判断根节点booklist是否有type属性
print('booklist 元素存在type属性')
else:
print('booklist 元素不存在type属性')
ElementsByTagName('book')[0].hasAttribute('category'):
#判断第⼀个book节点是否有category属性
print('第⼀个book节点存在category属性')
else:
print('第⼀个book节点不存在category属性')
代码⽰例:’’‘Attribute获取节点的属性值’’’
from xml.dom.minidom import parse
#minidom解析器打开xml⽂档并将其解析为内存中的⼀棵树
DOMTree=parse(l')
#获取xml⽂档对象,就是拿到树的根
booklist=DOMTree.documentElement
if booklist.hasAttribute('type'):
#判断根节点booklist是否有type属性
print('booklist 元素存在type属性')
print ('根节点booklist的type属性值为:',Attribute('type'))
else:
print('booklist 元素不存在type属性')
node.childNodes:返回节点node下所有的⼦节点组成的list 代码⽰例:’’‘node.childNodes’’’
from xml.dom.minidom import parse
#minidom解析器打开xml⽂档并将其解析为内存中的⼀棵树
DOMTree=parse(l')
#获取xml⽂档对象,就是拿到树的根
booklist=DOMTree.documentElement
#获取booklist对象中所有book节点的list集合
ElementsByTagName('book')
print('第⼀个book元素的所有⼦节点:',books[0].childNodes)
获得标签属性
每⼀个结点都有它的nodeName,nodeValue,nodeType属性
代码⽰例:’’‘获取标签属性’’'
from xml.dom.minidom import parse
print ('collection属性',deType) #获取所有的movies节点
ElementsByTagName('movie')
#遍历集合,打印所有节点的nodename/nodeValue/nodeType
for movie in movies:
print ("*******************movie*******************")
for node in movie.childNodes:
print (deType)
获取节点⽂本值
代码⽰例:’’‘获取节点⽂本值’’'
from xml.dom.minidom import parse
合同管理制度#minidom解析器打开xml⽂档并将其解析为内存中的⼀棵树
DOMTree=parse(l')
#获取xml⽂档对象,就是拿到树的根
booklist=DOMTree.documentElement
if booklist.hasAttribute('type'):
#判断根节点booklist是否有type属性,有则获取并打印属性值
print('Root element is ',Attribute('type'))
#获取booklist对象中所有的book节点的list集合
ElementsByTagName('book')
print('book节点的个数为:',len(books))
print('book节点的个数为:',books.length)
print ()
for book in books:
print ("*******************book*******************")
if book.hasAttribute('category'):
print ('category is ',Attribute('category'))
#根据节点名title/author/pageNumber得到这些节点的集合list
ElementsByTagName('title')[0]
ElementsByTagName('author')[0]请示的格式
ElementsByTagName('pageNumber')[0]
print ('title is ',title.childNodes[0].data)
print ('author is ',author.childNodes[0].data)
print ('pageNumber is ',pageNumber.childNodes[0].data)
node.hasChildNodes():判断是否有⼦节点
代码⽰例:’’‘node .hasChildNodes()’’'
from xml.dom.minidom import parse
#minidom解析器打开xml⽂档并将其解析为内存中的⼀棵树
DOMTree=parse(l')
#获取xml⽂档对象,就是拿到树的根
booklist=DOMTree.documentElement
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论