3-14 Python处理XML文件
xml文件处理
什么是xml文件?
xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
从结构上,很像HTML超文本标记语言。但他们被设计的目的是不同的,具体如下:
- XML 被设计用来传输和存储数据。
- HTML 被设计用来显示数据。
比如如下格式:
<?xml version="1.0" encoding="utf-8"?> <note> <to id='001'>George</to> <from>John</from> <heading>Reminder</heading> <body>Don't forget the meeting!</body> </note>
xml特征:
- 它是有标签对组成,<aa></aa>
- 标签可以有属性:<aa id='123'></aa>
- 标签对可以嵌入数据:<aa>abc</aa>
- 标签可以嵌入子标签(具有层级关系)
XMl文件结构
- XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。
- 第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码
- <note>是根元素,也称为根节点。
- <to><from><heading><body>是子元素(子节点)
- XML 文档必须包含根元素。该元素是所有其他元素的父元素
DOM文档对象模型
文档对象模型(Document Object Model,简称DOM),DOM 就是针对 HTML 和 XML 提供的一个API。什么意思?就是说为了能以编程的方法操作这个 HTML 的内容(比如添加某些元素、修改元素的内容、删除某些元素),我们把这个 HTML或xml 看做一个对象树(DOM树),它本身和里面的所有东西比如 <div></div> 这些标签都看做一个对象,每个对象都叫做一个节点(node)。
DOM 有什么用?
就是为了操作 HTML或xml 中的元素,比如说我们要通过 JS 把这个网页的标题改了,直接这样就可以了:
document.title = '123456';
创建xml文件
创建一个xml文件Class_info.xml 用来存储班级学生(姓名,年龄,城市),老师(姓名,年龄,城市)、教务账号(学生和老师的账号,密码)等信息。
<?xml version="1.0" encoding="UTF-8" ?> <Class> <student> <name>张三</name> <!--元素节点,文本节点,属性节点--> <age>28</age> <city>北京</city> </student> <student> <name>李四</name> <age>23</age> <city>深圳</city> </student> <student> <name>王五</name> <age>30</age> <city>上海</city> </student> <teacher> <name>马保国</name> <age>53</age> <city>浙江</city> </teacher> <account> <login username="student" password="123456"/> <!--属性节点--> <login username="teacher" password="888888"/> </account> </Class>
xml节点
xml文件节点一般包含3类:
- 元素节点
- 文本节点
- 属性节点
每个节点都拥有包含着关于节点某些信息的属性。这些属性是:
- nodeName(节点名称)
- nodeValue(节点值)
- nodeType(节点类型)
读取元素节点
案例:查看Class_info.xml文件里Class节点的属性(结点名称,节点的值、节点类型)
from xml.dom import minidom # 打开XML文件 dom = minidom.parse('Class_info.xml') # 加载dom对象元素 root = dom.documentElement # 打印节点信息 print(root.nodeName) print(root.nodeValue) print(root.nodeType)
- nodeName 节点名称
- nodeValue 返回文本节点的值
- nodeType 属性返回以数字值返回指定节点的节点类型。
- 如果节点是元素节点,则 nodeType 属性将返回 1。
- 如果节点是属性节点,则 nodeType 属性将返回 2。
读取文本节点的值
案例:分别打印出Class_info.xml里的学生和老师的详细信息(姓名,年龄、城市)
from xml.dom import minidom dom = minidom.parse('Class_info.xml') root = dom.documentElement names = root.getElementsByTagName('name') ages = root.getElementsByTagName('age') citys = root.getElementsByTagName('city') for i in range(4): print(names[i].firstChild.data) print(ages[i].firstChild.data) print(citys[i].firstChild.data)
读取属性节点的值
案例:分别读取打印老师和学生的账号密码。
from xml.dom import minidom dom = minidom.parse('Class_info.xml') root = dom.documentElement logins = root.getElementsByTagName('login') for i in range(2): username = logins[i].getAttribute('username') print(username) password = logins[i].getAttribute('password') print(password)
读取子节点信息
读取子节点<student>相关属性
- nodeName(节点名称)
- nodeValue(节点值)
- nodeType(节点类型)
# d导入XML模块 from xml.dom import minidom # 打开XML文件 dom= minidom.parse('Class_info.xml') root = dom.documentElement tags= root.getElementsByTagName('student') print(tags[0].nodeName) print(tags[0].nodeType) print(tags[0].nodeValue)