Python解析xml數據

xml

xml(Extensible Markup Language,可擴展標記語言),它是一種標記語言,定義了一組規則。
xml沒有什麼特別的,僅僅是純文本內容,只是和json定義的規則不一樣而已。

xml數據結構

<data info="student">
	<name>小明</name>
	<age>18</age>
	<gender>男</gender>
</data>

上述就是一個簡單的xml數據,這裏有幾個概念,包括:

  • 根元素 <data>
  • 子元素 <name><age>…
  • 標籤 帶<>都是標籤<data>是開始標籤,</data>是結束標籤
  • 屬性 開始標籤中有其它信息的是屬性如data標籤中的info
  • 文本 被開始標籤和結束標籤包含的是文本,如小明

這裏就簡單的複習了下xml數據。下面使用Python來解析xml數據。

python中的xml模塊

python自帶xml模塊方便開發者解析xml數據。xml模塊中包含了廣泛使用的API接口--------SAX和DOM。

  • SAX(Simple API for XML)解析xml數據
    xml簡單處理API,通過解析XML的過程來觸發事件來處理XML文件。不會將整個文件讀取到內存中,只讀取需要部分的內容。

    xml.sax下提供的函數:

函數名 功能
make_parser(parser_list=[]) 創建並返回SAX解析器
parse(filename_or_strease,handler,error_handler=handler.ErrorHandler()) 解析xml文件,filename_or_stream爲指定解析的文件或流,handler爲處理XML的回調,通過setContentHandler設置,error_handler爲錯誤回調處理
parseString(string,handler,error_handler=handler.ErrorHandler() 與parse一樣,只是從string中解析xml
SAXException(msg,exception=None) XML操作相關的錯誤或警告

ContentHandler主要事件回調:

方法名 說明
startDocument() 文檔解析開始調用一次
endDocument() 解析到文檔結尾調用一次
startElement(name,attrs) 文件模式下,遇到開始標籤調用該方法,name是標籤名,attrs是屬性值字典
endElement(name) 文件模式下,遇到結束標籤調用該方法,name是標籤名
characters(content) 核心方法,1.從行開始,遇到標籤之前存在字符,content的值爲這些字符。2.從一個標籤開始到一個標籤結束,content爲標籤中包含的字符。3.從一個標籤到行結束,存在字符,content爲這些字符

xml.sax解析代碼:

# coding=utf-8
import xml.sax

data_list = []


class MyContentHandler(xml.sax.ContentHandler):

    def __init__(self):
        super().__init__()
        self.currentData = ""
        self.name = ""
        self.age = ""
        self.gender = ""

    def startDocument(self):
        print("開始解析xml")

    def endDocument(self):
        print("解析xml結束")

    def startElement(self, name, attrs):
        self.currentData = name

    def endElement(self, name):
        global data_list
        if name == 'name':
            data_list.append(self.name)
        elif name == 'age':
            data_list.append(self.age)
        elif name == 'gender':
            data_list.append(self.gender)

    def characters(self, content):
        if self.currentData == "name":
            self.name = content
        elif self.currentData == "age":
            self.age = content
        elif self.currentData == "gender":
            self.gender = content


if __name__ == '__main__':
    saxParse = xml.sax.make_parser()
    saxParse.setFeature(xml.sax.handler.feature_namespaces, 0)  # 關閉命名解析
    handler = MyContentHandler()
    saxParse.setContentHandler(handler)
    saxParse.parse('xml_data.xml')
    print(data_list)

運行結果:
運行結果

  • DOM(Document Object Model,文檔對象模型)解析xml數據

DOM(文檔對象模型)是W3C組織推薦處理可擴展標記語言的標準編程接口。
DOM讀取xml文件內容的基本操作:1.parse解析器(讀取內容),2.DOM函數處理xml數據。

DOM對象的相關函數

接口對象名 說明
DOMImplementation DOM對象底層實現
Node 文檔中大多數對象的基本接口
NodeList 節點列表接口
DocumentType 文檔聲明信息
Document 整個文檔對象
Element 元素節點
Attr 屬性節點
Comment 在源文檔中表示評論
Text 節點中包含的文本內容
ProcessingInstruction 處理指令

dom解析xml數據示例代碼:

# coding=utf-8
import xml.dom.minidom

data_list = []

if __name__ == '__main__':
    document_tree = xml.dom.minidom.parse('xml_data.xml')
    collection = document_tree.documentElement # 獲取所有元素
    print(collection.toxml())
    name_node = document_tree.getElementsByTagName("name")[0]
    name = name_node.childNodes[0].data
    data_list.append(name)
    age_node = document_tree.getElementsByTagName("age")[0]
    age = age_node.childNodes[0].data
    data_list.append(age)
    gender_node = document_tree.getElementsByTagName("gender")[0]
    gender = gender_node.childNodes[0].data
    data_list.append(gender)
    print(data_list)

運行結果:
在這裏插入圖片描述

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