python三种XML解析方式

什么是XML



    .xml指可扩展标记语言(EXtensible Markup Language)。
    .xml是一种标记语言,很类似HTML。
    .xml的设计宗旨是传输数据,而非显示数据。
    .xml的标签需要我们自行定义。
    .xml被设计为具有自我描述性。
    .xml是w3c的推荐标准。


    XML和HTML的区别


        XML:是可扩展标记语言,被设计为传输和存储数据,其焦点是数据的内容。
        HTML:是超文件标记语言,主要是显示数据以及如何更好显示数据。
        HTML DOM:文档对象模型,通过HTML DOM,可以访问所有的HTML元素,连同它们所包含的文本和属性。可以对其中的内容进行修改,
                  和删除,同时也可以创建新的对象。


python对XML的解析:



    常见的XML编程接口有DOM和SAX,这两种接口处理XML文件的方式不同,当前使用的场合也不同。
    python有三种方法解析XML,分别是:SAX、DOM,以及ElementTree;


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


    2.DOM(Document Object Model):
         将XML数据在内存中解析成一个树,通过对书的操作来操作XML。


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


三种优缺点比较:



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


Python使用SAX解析XML:



     SAX是一种基于事件驱动的API。
     利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。
     解析器负责读取XML文档,并向事件处理器发生事件,如元素的开始跟元素结束事件。
     而事件处理器则负责对事件做出相应,对传递的XML数据进行处理。
           1.对大型文件进行处理。
           2.只需要文件的部分内容,或者只需要从文件中得到特定的信息。
           3.想建立自己的对象模型的时候。
     在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler.


ContentHandler类方法介绍

characters(content)方法
    调用时机:
        1.从行开始,遇到标签之前,存在的字符,content的值为这些字符串。
        2.从一个标签,遇到下一个标签之前,存在的字符,content的值为这些字符串。
        3.从一个标签,遇到行结束符之前,存在的字符,content的值为这些字符串。
    标签可以是开始标签,也可以是结束标签。
  
     startDocument()方法:
          文件启动的时候调用。
     endDocument()方法:
           解析器到达文档结尾时调用。
     startElement(name,attrs)方法:
           遇到XML开始标签时调用,name时标签的名字,attrs是标签的属性值字典。
     endElement(name)方法:
            遇到XML结束标签时调用。
     make_parser方法:
        以下方法创建一个新的解析器对象并返回。
           xml.sax.make_parser([parse_list])
        类型说明:
           parser_list : 可选参数,解析器列表。
     parser方法:
            xml.sax.parser(xmlFile,contenthandler[,errorhandler])
         参数说明:
             xmlFile: xml文件名
             contenthandler:必须是一个ContentHandler的对象
             errorhandler:如果指定的该参数,errorhandler必须是一个SAX ErrorHandler对象
     parseString方法:
         parseString方法创建一个XML解析器并解析xml字符串:
              xml.sax.parseString(xmlstring,contenthandler[,errorhandler])
         参数说明:
              xmlstring : xml字符串
              contenthandler : 必须是一个ContentHandler的对象
              errorhandler : 如果指定该参数,errorhandler必须是一个SAX ErrorHandler对象


本次使用xml为:



<?xml version="1.0" encoding="UTF-8" ?>
<persons desc="This is Person">
    <person id="p01">
         <name>张三</name>
         <age>18</age>
         <sex>男</sex>
    </person>
    <person id="p02">
         <name>李四</name>
         <age>20</age>
         <sex>男</sex>
    </person>
    <person id="p03">
         <name>小红</name>
         <age>21</age>
         <sex>女</sex>
    </person>
    <person id="p04">
         <name>小明</name>
         <age>18</age>
         <sex>男</sex>
    </person>
</persons>


Python解析XML实例:



     #SAX方式:
from xml.sax import parse;
from xml.sax import ContentHandler
class Person():
    def __init__(self,name = None,age = None,sex = None):
        self.name = name
        self.age = age
        self.sex = sex
    def __str__(self):
        return "我的姓名是:{0},我的年龄是:{1},我的性别是:{2}".format(self.name,self.age,self.sex)
persons = []
class saxDemo(ContentHandler):
    def __init__(self):
       self.person=None
       self.tag = None
    def startDocument(self):
        print("文档启动的时候调用")
    # 元素开始调用
    def startElement(self, name, attrs):
        if name=="person":
            #创建对象
            self.person = Person()
    #读取字符调用
    def characters(self, content):
        #获得读取到的内容
        self.tag = content
    #元素结束时调用
    def endElement(self, name):
        if name == "name":
            self.person.name = self.tag
        if name == "age":
            self.person.age = self.tag
        if name == "sex":
            self.person.sex = self.tag
        if name == "person":
            persons.append(self.person)
    def endDocument(self):
        print("解析器到达文档结尾时调用")
#创建一个 SAX 解析器并解析xml文档:
parse("Person.xml",saxDemo())
for p in persons:
    print(p)


输出结果为:


    我的姓名是:张三,我的年龄是:18,我的性别是:男
    我的姓名是:李四,我的年龄是:20,我的性别是:男
    我的姓名是:小红,我的年龄是:21,我的性别是:女
    我的姓名是:小明,我的年龄是:18,我的性别是:男


使用xml.dom解析xml



    文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。
    一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。
    python中用xml.dom.minidom来解析xml文件


    栗子一枚:
      #使用DOM
from xml.dom.minidom import parse
#打开文档
domTree = parse("Person.xml")
#获得文档的内容
collection = domTree.documentElement
#<persons desc="This is Person">
if collection.hasAttribute("desc"):
    print("根节点的属性描述是:",collection.getAttribute("desc"))
#在集合中获取所有的人类
persons = collection.getElementsByTagName("person")
#打印每个人的详细信息
for p in persons:
    #居中显示
    print("详细信息".center(20))
    if p.hasAttribute("id"):
        print("id:",p.getAttribute("id"))
    #获得name所在的节点
    name = p.getElementsByTagName("name")[0]
    #输出name所在节点的值
    print("name:",name.childNodes[0].data)
    age = p.getElementsByTagName("age")[0]
    print("age:",age.childNodes[0].data)
    sex = p.getElementsByTagName("sex")[0]
    print("sex:",sex.childNodes[0].data)


使用ElementTree解析XML



    需要引入一个模块
        import xml.etree.ElementTree as et
    栗子一枚:
    #使用ElementTree解析XML
import xml.etree.ElementTree as et
class Person():
    def __init__(self,name = None,age = None,sex = None):
        self.name = name
        self.age = age
        self.sex = sex
    def __str__(self):
        return "我的名字是:{0},我今年{1}岁啦,我是一名{2}同学".format(self.name,self.age,self.sex)
#打开文档
root = et.parse("Person.xml")
#查询所有person的的标签
personsTree = root.findall("person")
persons = []
#遍历
for p in personsTree:
    #封住数据
    person = Person()
    person.name = p.find("name").text;
    person.age = p.find("age").text;
    person.sex = p.find("sex").text;
    persons.append(person)
#输出封装的数据
for ps in persons:
    print(ps)

猜你喜欢

转载自blog.csdn.net/weixin_42238444/article/details/80725322