专栏首页python学习笔记python之XML文件解析
原创

python之XML文件解析

python对XML的解析

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

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

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

  先写一个关于book的xml文件

<books>
    <book id="01">
        <bookname>python入门</bookname>
        <author>李强</author>
        <price>25</price>
    </book>
    <book id="02">
        <bookname>java基础</bookname>
        <author>王洋</author>
        <price>30</price>
    </book>
    <book id="03">
        <bookname>神雕侠侣</bookname>
        <author>金庸</author>
        <price>212</price>
    </book>

</books>

1.DOM(Document Object Model)

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

操作代码如下:

#引入parse的包
from xml.dom.minidom import parse

doc=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.price

books=[]#定义一个书的数组,用来存放每次得到的数据

#定义继承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.price

roota=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入门,李强,25
java基础,王洋,30
神雕侠侣,金庸,212

Process finished with exit code 0

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • python __str__()函数的作用

    不知道大家再写程序是,打印一个实例化对象时,打印的其实时一个对象的地址。而通过__str__()函数就可以帮助我们打印对象中具体的属性值,或者你想得到的东西。

    风之随想
  • Python __init__.py 作用详解

    __init__.py 文件的作用是将文件夹变为一个Python模块,Python 中的每个模块的包中,都有__init__.py 文件。

    风之随想
  • Python创建包,导入包

    《Python包》一节中已经提到,包其实就是文件夹,更确切的说,是一个包含“__init__.py”文件的文件夹。因此,如果我们想手动创建一个包,只需进行以下 ...

    风之随想
  • 87-OOP之必需掌握的magic

    凯茜的老爸
  • Selenium测试程序的优化

    比如测试程序在继续后续测试的时候出现了一个异常,比如元素没有找到,系统会自动退出,而不去执行teardown方法,也就是说数据库中的数据没有得到清除,这样如果下...

    小老鼠
  • GBDT回归的原理及Python实现

    提到GBDT回归相信大家应该都不会觉得陌生,本文就GBDT回归的基本原理进行讲解,并手把手、肩并肩地带您实现这一算法。完整实现代码请参考本人的github。

    Python中文社区
  • 推荐系统遇上深度学习(二十七)--知识图谱与推荐系统结合之RippleNet模型原理及实现

    依次训练的方法主要有:Deep Knowledge-aware Network(DKN) 联合训练的方法主要有:Ripple Network 交替训练主要采用m...

    石晓文
  • PYQT中的菜单和工具栏

    在这部分的PyQt5教程中,我们将创建菜单和工具栏。菜单式位于菜单栏的一组命令操作。工具栏是应用窗体中由按钮和一些常规命令操作组成的组件。

    小飞侠xp
  • Pytorch 深度学习实战教程(三):UNet模型训练,深度解析!

    PS:文中出现的所有代码,均可在我的 github 上下载,欢迎 Follow、Star:点击查看

    Jack_Cui
  • Python模拟登录和登录跳转

    py3study

扫码关注云+社区

领取腾讯云代金券