Xml文件读取

应用背景

Python可以对xml文件、txt、和csv文件进行读写操作,接下来将一一介绍使用文件读写方法。

xml文件读写

什么是xml文件?

xml即可扩展标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。

从结构上,很像HTML超文本标记语言。但他们被设计的目的是不同的,具体如下:

  • XML 被设计用来传输和存储数据。
  • HTML 被设计用来显示数据。

xml特征:

1
2
3
4
5
6
7
<?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>
  • 它是有标签对组成,
  • 标签可以有属性:
  • 标签对可以嵌入数据:abc
  • 标签可以嵌入子标签(具有层级关系)

XMl文件结构

  • XML 文档形成了一种树结构,它从“根部”开始,然后扩展到“枝叶”。
  • 第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码
  • 是根元素,也称为根节点。
  • 是子元素(子节点)
  • XML 文档必须包含根元素。该元素是所有其他元素的父元素

DOM文档对象模型

文档对象模型(Document Object Model,简称DOM),DOM 就是针对 HTML 和 XML 提供的一个API。什么意思?就是说为了能以编程的方法操作这个 HTML 的内容(比如添加某些元素、修改元素的内容、删除某些元素),我们把这个 HTML或xml 看做一个对象树(DOM树),它本身和里面的所有东西比如

这些标签都看做一个对象,每个对象都叫做一个节点(node)。

DOM 有什么用?

就是为了操作 HTML或xml 中的元素,比如说我们要通过 JS 把这个网页的标题改了,直接这样就可以了:

1
document.title = '51zxw';

创建xml文件

创建一个xml文件Class_info.xml 用来存储班级学生(姓名,年龄,城市),老师(姓名,年龄,城市)、教务账号(账号,密码)等信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?xml version="1.0" encoding="UTF-8" ?>
<Class>
<student>
<name >Jack</name>
<age>28</age>
<city>Beijing</city>
</student>

<student>
<name >Bob</name>
<age>25</age>
<city>Shanghai</city>
</student>

<student>
<name>Harry</name>
<age>23</age>
<city>ShenZhen</city>
</student>

<teacher>
<name>Marry</name>
<age>23</age>
<city>Changsha</city>
</teacher>

<account>
<login username="student" password="123456"/>
<login username="teacher" password="888888"/>
</account>
</Class>

xml节点

xml文件节点一般包含3类:

  1. 元素节点
  2. 文本节点
  3. 属性节点

每个节点都拥有包含着关于节点某些信息的属性。这些属性是:

  • nodeName(节点名称)
  • nodeValue(节点值)
  • nodeType(节点类型)
读取元素节点的值

案例:查看Class_info.xml文件里Class节点的属性(结点名称,节点的值、节点类型)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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)

#获取属性节点
logins=root.getElementsByTagName('login')[0].getAttributeNode('username')
print(logins.nodeType) #返回值是2
  • nodeName 节点名称
  • nodeValue 返回文本节点的值
  • nodeType 属性返回以数字值返回指定节点的节点类型。
    1. 如果节点是元素节点,则 nodeType 属性将返回 1。
    2. 如果节点是属性节点,则 nodeType 属性将返回 2。
读取文本节点的值

案例:分别打印出Class_info.xml里的学生和老师的详细信息(姓名,年龄、城市)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
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')

#分别打印显示xml文档标签对里面的内容
for i in range(4):
print(names[i].firstChild.data)
print(ages[i].firstChild.data)
print(citys[i].firstChild.data)
读取属性节点的值

案例:分别读取老师和学生的账号密码。

1
2
3
4
5
6
7
8
9
10
11
12
13
from  xml.dom import minidom
dom=minidom.parse('Class_info.xml')

root=dom.documentElement

logins=root.getElementsByTagName('login')

#获取login标签的username属性
for i in range(2):
username=logins[i].getAttribute('username')
print(username)
password=logins[i].getAttribute('password')
print(password)
读取子节点信息

读取子节点相关属性

1
2
3
4
5
6
7
8
9
10
11
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].tagName)
print(tags[0].nodeType)
print(tags[0].nodeValue)