zoukankan      html  css  js  c++  java
  • 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

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

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

  • 相关阅读:
    不能访问windows installer服务
    clr/c++自定线程安全集合
    Electron-Vue工程初始化,以及需要掌握的相关知识
    Windows下启动.Net Core程序脚本
    Electron打包
    .Net Core入门与.Net需要注意的地方
    winfrom 点击按钮button弹框显示颜色集
    获取计算机的网卡及打印机信息
    winfrom 界面时间动态加载
    c# winfrom 界面设计
  • 原文地址:https://www.cnblogs.com/qianshuixianyu/p/9184213.html
Copyright © 2011-2022 走看看