Python XML解析之DOM
解析people.xml:
<?xml version="1.0" encoding="utf-8" ?>
<people>
<person id="1">
<name>张三</name>
<age>18</age>
<tel>1552644646446</tel>
</person>
<person id="2">
<name>李四</name>
<age>16</age>
<tel>12599897</tel>
</person>
<person id="3">
<name>王五</name>
<age>17</age>
<tel>21245478956</tel>
</person>
</people>
先创建一个person.py:
class person:
name=None
age=None
tel=None
def __init__(self,name=None,age=None,tel=None):
self.name=name
self.age=age
self.tel=tel
def __repr__(self):
return "{0:20}{1:<5}{2:15}".format(self.name,self.age,self.tel)
1.DOM(Document Object Model)
与SAX比较,DOM典型的缺点是比较慢,消耗更多的内存,解析一些小型xml还可以,因为DOM会将整个XML数读入内存中,并为树
中的第一个节点建立一个对象。使用DOM的好处是你不需要对状态进行追踪,因为每一个节点都知道谁是它的
父节点,谁是子节点。但是DOM用起来有些麻烦。
代码如下(如果中间有代码不懂,最下面有解释,希望可以帮到你):
#导入模块
from xml.dom.minidom import parse
from person import person
people = []#创建一个空列表
d=parse('people.xml')#生成document对象
print(d)
c=d.documentElement#获取根节点people
print(c)
ps =c.getElementsByTagName("person")#获取根节点下的全部子节点person
# p=ps[0]
# p1= p.getAttribute("id")#这个是获取username的属性id的数据
print(ps)
for i in ps: #对数据处理
# name=i.getElementsByTagName("name")[0].firstChild.data#获取tag为name的属性值
# age=int(i.getElementsByTagName("age")[0].firstChild.data)#获取tag为age的属性值并转换成int类型
# tel=i.getElementsByTagName("tel")[0].firstChild.data#获取tag为tel的属性值
name=i.getElementsByTagName("name")[0].childNodes[0].data#获取tag为name的属性值
age=int(i.getElementsByTagName("age")[0].childNodes[0].data)#获取tag为age的属性值并转换成int类型
tel=i.getElementsByTagName("tel")[0].childNodes[0].data#获取tag为tel的属性值
p=person(name,age,tel)
people.append(p)#把获取的值添加到空列表中
print(people)
#用lambda表达式以年龄降序输出
for p in sorted(people,key=lambda x : x.age , reverse=True):
print(p)
print("*********************************")
#用lambda表达式以name升序输出
people.sort(key=lambda x : x.name.encode("utf-8"), reverse=False)
for p in people:
print(p)
1.mxl.dom.minidom 模块被用来处理xml文件,所以要引入。
2.xml.dom.minidom.parse() 用于加载打开一个xml文件,生成dom对象
3.documentElement 返回xml文档的根节点(就是people)
4.getElementsByTagName(“name”)方法返回带有name标签对象的集合,[0]是集合中第一个]
5.childNodes属性返回节点(比如:name)的子节点集合,[0]是集合中的第一个。
也可以用firstChild 属性,它返回指定节点(比如:name)的首个子节点(上面我把用这个firstChild属性注释掉了)
6..data属性表示获取该节点数据
7.getAttribute方法获取people.xml中的person的id属性的值(我给注释掉了,解析people.xml暂时用不到,我记录一下方便以后学习)