博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python之XML文件解析
阅读量:6503 次
发布时间:2019-06-24

本文共 3824 字,大约阅读时间需要 12 分钟。

python对XML的解析

常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当然使用场合也不同。

python有三种方法解析XML,分别是SAX,DOM,以及ElementTree三种方法。

以下案例依次介绍三种方法:

  先写一个关于book的xml文件

python入门
李强
25
java基础
王洋
30
神雕侠侣
金庸
212

 

 

1.DOM(Document Object Model)

将XML数据在内存中解析成一个树,通过对树的操作来操作XML。

操作代码如下:

#引入parse的包from xml.dom.minidom import parsedoc=parse("book.xml")                   #先把xml文件加载进来root=doc.documentElement                #获取元素的根节点books=root.getElementsByTagName('book') #找到子节点,得到的是一个数组for book in books:                       #把所有的子节点进行遍历    print("===book====")    if book.hasAttribute('id'):             #如果有ID属性,则输出        print('书的ID是:%s'% book.getAttribute('id'))    bookname=book.getElementsByTagName("bookname")[0]  #根据标签名找到,并且输出第一个元素    print("书名是:%s"%bookname.childNodes[0].data)      #输出标签名的子节点的第一个值,并转为data类型    author=book.getElementsByTagName("author")[0]    print("作者是:%s"%author.childNodes[0].data)    price=book.getElementsByTagName("price")[0]    print("价格是:%s"%price.childNodes[0].data)

 

2.SAX (simple API for XML )

python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。

 

from xml.sax import parse, ContentHandler #引入继承包ContentHandler#书的类class Book:    #定义初始化属性,和xml文件属性相同    def __init__(self,bookname=None,author=None,price=None):        self.bookname=bookname        self.author=author        self.price=price    def __str__(self):  #转化为字符串输出        return self.bookname+","+self.author+","+self.pricebooks=[]#定义一个书的数组,用来存放每次得到的数据#定义继承ContentHandler的类,可以实现相应的方法class bkdemo(ContentHandler):    def __init__(self):        #定义全局变量        self.book=None #用来接收book的相应数据        self.tag=None  #用来接收characters方法得到的content内容    def startDocument(self): #books对象开始        print("对象开始")    def endDocument(self):  #books对象结束        print("对象结束")    def startElement(self, name, attrs): #每一个标签元素的开始,name:标签名称 attrs:标签内部相应属性        if name=='book':  #如果标签名是book            self.book=Book()  #创建一个Book()对象    def endElement(self, name):  #每一个标签元素的结束,name:标签名称 (此时才会得到相应的content)        if name=='bookname':            self.book.bookname=self.tag  #对象的标签名=得到相应content的值        if name=='author':            self.book.author=self.tag        if name=='price':            self.book.price=self.tag        if name=='book':            books.append(self.book)  #为定义的数组追加得到的相应元素    def characters(self, content):        self.tag=content   #写了self的,就可以定义为全局变量parse("book.xml",bkdemo())  #parse的方法,分别指明xml文件,并调用查找的类方法for i in books:   #对数组books[]循环    print(i)

 

3.ElementTree(元素树)

ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。

from xml.etree import ElementTree  #引入ElementTree的包#书的类class Book:    #定义初始化属性,和xml文件属性相同    def __init__(self,bookname=None,author=None,price=None):        self.bookname=bookname        self.author=author        self.price=price    def __str__(self):  #转化为字符串输出        return self.bookname+","+self.author+","+self.priceroota=ElementTree.parse("book.xml") #parse方法读取xml文件,得到元素树bk=roota.findall("book")  #findall查询所有的book标签boo=[]   #定义一个集合for aa in bk:   #对得到的所有的根元素下的子标签循环输出    book=Book()   #定义一个类对象    book.bookname=aa.find("bookname").text #对象的相应标签值=子标签查找到的固定标签名,并以text形式输出    book.author=aa.find("author").text    book.price=aa.find("price").text    boo.append(book)  #将得到的属性值追加到定义的集合中for i in boo:  #遍历集合    print(i)

输出结果:

python入门,李强,25java基础,王洋,30神雕侠侣,金庸,212Process finished with exit code 0

 

 

注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)。

本章节使用到的 XML 实例文件 movies.xml 内容如下:

转载于:https://www.cnblogs.com/qianshuixianyu/p/9184213.html

你可能感兴趣的文章
php 引入其他文件中的变量
查看>>
MYSQL体系结构-来自期刊
查看>>
mysql的基本知识
查看>>
webpack入门(二)what is webpack
查看>>
UnitOfWork以及其在ABP中的应用
查看>>
学习C语言必须知道的理论知识(第一章)
查看>>
for语句内嵌例题与个人理解
查看>>
眠眠interview Question
查看>>
[转]CSS hack大全&详解
查看>>
RPC-client异步收发核心细节?
查看>>
#define WIN32_LEAN_AND_MEAN 的作用
查看>>
仿余额宝数字跳动效果 TextCounter
查看>>
简化代码的微小修改
查看>>
你必须知道的.net学习总结
查看>>
Axure8.0 网页 or App 鼠标滚动效果
查看>>
文件操作示例脚本 tcl
查看>>
大家好,新年快乐。
查看>>
prototype
查看>>
Android学习路线
查看>>
Linux下的redis的持久化,主从同步及哨兵
查看>>