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)
運行結果: