什麼是XML?
XML 指可擴展標記語言(eXtensible Markup Language),標準通用標記語言的子集,是一種用於標記電子文件使其具有結構性的標記語言。 你可以通過本站學習
XML 被設計用來傳輸和存儲數據。
XML是一套定義語義標記的規則,這些標記將文檔分成許多部件並對這些部件加以標識。
它也是元標記語言,即定義了用於定義其他與特定領域有關的、語義的、結構化的標記語言的句法語言。
XML語法
a) XML 必須包含根元素,它是所有其他元素的父元素,就像下面這個中 students 就是根元素:
- <?xml version="1.0" encoding="utf-8" ?>
- <students>
- <student>
- <name>李明</name>
- <sex>女</sex>
- <age>18</age>
- <height>1.6</height>
- <score>178</score>
- </student>
b)所有的 XML 元素都必須有一個關閉標籤!
c)XML 必須正確嵌套
d)開始部分: <?xml version=”1.0”encoding=”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)