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)  


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