Python 解析器

什么是XML?

XML 指可扩展标记语言(eXtensible Markup Language),标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。 你可以通过本站学习

XML 被设计用来传输和存储数据。

XML是一套定义语义标记的规则,这些标记将文档分成许多部件并对这些部件加以标识。

它也是元标记语言,即定义了用于定义其他与特定领域有关的、语义的、结构化的标记语言的句法语言。

XML语法

       a)  XML 必须包含根元素,它是所有其他元素的父元素,就像下面这个中 students 就是根元素:

[html] view plain copy
  1. <?xml version="1.0" encoding="utf-8" ?>  
  2. <students>  
  3.     <student>  
  4.         <name>李明</name>  
  5.         <sex></sex>  
  6.         <age>18</age>  
  7.         <height>1.6</height>  
  8.         <score>178</score>  
  9.     </student>  

       b)所有的 XML 元素都必须有一个关闭标签!

      c)XML 必须正确嵌套

      d)开始部分:  <?xml version=1.0encoding=utf-8>

    e)标签成对出现,并且区分大小写

    f)可以有属性,只能有一个根节点!!!

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。

python使用SAX解析xml

SAX是一种基于事件驱动的API。

利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。

解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟元素结束事件;

而事件处理器则负责对事件作出相应,对传递的XML数据进行处理。

<psax适于处理下面的问题:< p="" style="color: rgb(51, 51, 51); font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', 'Noto Sans CJK SC', 'WenQuanYi Micro Hei', Arial, sans-serif; font-size: 12px; background-color: rgb(255, 255, 255);">
  • 1、对大型文件进行处理;
  • 2、只需要文件的部分内容,或者只需从文件中得到特定信息。
  • 3、想建立自己的对象模型的时候。

在python中使用sax方式处理xml要先引入xml.sax中的parse函数,还有xml.sax.handler中的ContentHandler。

使用xml.dom解析xml

文件对象模型(Document Object Model,简称DOM),是W3C组织推荐的处理可扩展置标语言的标准编程接口。

一个 DOM 的解析器在解析一个 XML 文档时,一次性读取整个文档,把文档中所有元素保存在内存中的一个树结构里,之后你可以利用DOM 提供的不同的函数来读取或修改文档的内容和结构,也可以把修改过的内容写入xml文件。


(1)第一种是DOM解析

[python] view plain copy
from xml.dom.minidom import parse               #第一步必须要先导入模块  
class Student:                                  #第二步去定义一个类  
    def __init__(self,name,sex,age):  
        self.name = name  
        self.sex = sex  
        self.age = age  
    def __str__(self):  
        return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)  
  
student1 = []                           #定义一个空列表       
doc = parse("学生对象信息.xml")  
root = doc.documentElement              #从文档中获取根节点  
#print(root)  
students = root.getElementsByTagName("student")  
#print(students)  
for p in students:  
    student = Student(p.getElementsByTagName("name")[0].childNodes[0].data,p.getElementsByTagName("sex")[0].childNodes[0].data,p.getElementsByTagName("age")[0].childNodes[0].data)  
    student1.append(student)  
for p in student1:  
    print(p)  
(2)第二种是SAX解析

[python] view plain copy
from xml.sax import ContentHandler  
from xml.dom.minidom import parse  
  
class Student:  
    def __init__(self,name =None,sex = None,age = None):  
        self.name = name  
        self.sex = sex  
        self.age = age  
    def __str__(self):  
        return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)  
  
student1 = []  
class mysaxxml(ContentHandler):  
    def __init__(self):  
        self.tag=None                               #为什么要这么写???  
        self.stu=None  
    def startDocument(self):  
        print("startdocument...")  
    def startElement(self, name, attrs):  
        self.tag = name  
        if name =="student":  
            self.stu = Student()  
    def characters(self, content):  
        if self.tag =="name":  
            self.stu.name=content  
        if self.tag =="sex":  
            self.stu.sex=content  
        if self.tag =="age":  
            self.stu.age=content  
    def endElement(self, name):  
        if name == "student":  
            student1.append(self.stu)  
            self.stu = None  
        self.tag = None                             #此处为何这么放置 self.tag = None  ??  
    def endDocument(self):  
        print("endDocument.......")  
sts = mysaxxml()  
parse("学生对象信息.xml",sts)  
for p in student1:  
    print(p)  
(3)第三种 ElementTree 元素树解析
[python] view plain copy
from xml.etree.ElementTree import *  
  
class Student:  
    def __init__(self,name = None,sex = None,age = None):  
        self.name = name  
        self.sex = sex  
        self.age = age  
    def __str__(self):  
        return "姓名:{0}  性别:{1}  年龄:{2}".format(self.name,self.sex,self.age)  
  
people = []  
root = parse("学生对象信息.xml")  
student1 = root.findall("student")  
  
for p in student1:  
    student = Student()  
    student.name = p.find("name").text  
    student.sex = p.find("sex").text  
    student.age = p.find("age").text  
    people.append(student)  
for p in people:  
    print(p)  


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章