XML 指的是可扩展标记语言(eXtensible Markup Language),和json类似也是用于存储和传输数据,还可以用作配置文件。类似于HTML超文本标记语言,但是HTML所有的标签都是预定义的,而xml的标签可以随便定义。
XML元素
指从开始标签到结束标签的部分(均包括开始和结束)
一个元素可以包括:
其它元素
属性
文本
abc
混合以上所有
XML语法规则
所有的元素都必须有开始标签和结束标签,省略结束标签是非法的。如:
根元素
大小写敏感,以下是两个不同的标签
this is a test1
this is a test2
xml文档必须有根元素
this is a test2
joy
XML必须正确嵌套,父元素必须完全包住子元素。如:
this is a test2
XML属性值必须加引号,元素的属性值都是一个键值对形式。如:
注意:元素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,先建立名为book.xml的文件供后续使用。
learning math张三
561
learning Python李四
600
minidom.parse(parse=None,bufsie=None)
函数作用:使用parse解析器打开xml文档,并将其解析为DOM文档,也就是内存中的一棵树,并得到这个对象
doc.documentElement
获取xml文档对象,就是拿到DOM树的根
代码示例:
>>> from xml.dom.minidom import parse
>>> DOMTree=parse(r'book.xml')
>>> type(DOMTree)
>>> booklist=DOMTree.documentElement
>>> booklist
doc.toxml(encoding=None)
返回xml的文档内容
>>> booklist=DOMTree.documentElement
>>> print (booklist.toxml())
learning math张三
561
learning Python李四
600
node.lastChild
返回元素的最后一个子节点
node.firstChild
返回元素的首个子节点
代码示例:
>>> booklist.lastChild
>>> booklist.firstChild
getElementsByTagName(name)获取节点元素
获取xml文档中的某个父节点下具有相同节点名的节点对象的集合。返回的是list
代码示例:
from xml.dom.minidom import parse
#minidom解析器打开xml文档并将其解析为内存中的一棵树
DOMTree=parse(r'book.xml')
#获取xml文档对象,就是拿到树的根
booklist=DOMTree.documentElement