Python中定義了很多處理XML的函數,如xml.dom,它會在處理文件之前,將根據xml文件構建的樹狀數據存在內存。還有xml.sax,它實現了SAX API,這個模塊犧牲了便捷性,換取了速度和減少內存占用。
本文將要說明的是xml.tree.ElementTree的使用。與DOM比較,它使用起來更快更方便,和SAX比較呢,性能相仿,但使用起來更快捷。
ET(ElementTree)提供了兩個對象:ElementTree和Element
ElementTree:將整個XML轉化為樹,對整個XML文檔進行操作(讀取,寫入,查找等)一般在ElementTree層面進行。
Element:代表樹上單個節點,對單個XML元素及其子元素進行操作,則是在Element層面進行。
1)加載整個文檔(demo.xml):
import xml.etree.ElementTree as ET
tree = ET.ElementTree(file="demo.xml")
2)獲取根元素
root = tree.getroot()
根元素是一個Element對象,它具有以下屬性:
root.tag:返回元素的標簽名
root.attrib:以字典形式返回屬性名和值
3)根元素本身就是一個可迭代對象,和其他Element對象一樣,也具備直接遍歷子元素的接口
for child in root:
print(child.tag, child.attrib)
也可以通過索引來訪問特定的子元素 root[1].tag
4)查找需要的元素:find,findall, findText,iterfind等
find(tagName):總是返回第一個匹配的元素
findall(tagName):返回當前元素下一級所有匹配的元素列表
findtext:
iterfind(tagName):作用和findall一樣,但是它返回的是一個生成器。
4)要想找到當前元素下所有元素,而不是只找到下一級元素
list(root.iter()) #列出根元素下所有子節點列表
list(root.iter(tagName)) # 列出所有標簽名為tagName的子節點
5)正則表達式的使用:
*:所有 ---------> root.find("Menues/*") 查找路徑Menus下面的所有子節點
.:當前元素---------->root.find(./*) 查找當前元素下的所有子節點
//:------------> root.findall(".//Menu"):查找當前目錄下任意層級的標簽名為Menu的子元素
..:------------>root.findall(".//Menu/.."):查找當前目錄下任意層級的標簽名為Menu的子元素的父元素
[@attrib]:根據指定的屬性搜索元素
[@attrib='value']:根據給定屬性名搜索元素--------->root.findall("Tab[@type='subabsent']"):找到所有type為subabsent的Tab標簽
[tag]:----->root.findall("Tab[Menues]"):找到包含子元素為Menues的Tab標簽
[tag='text']:---------->root.findall("Tab[Menues=5]"):找到包含Menues標簽,且Menues標簽中間text值為5的Tab元素
[position]:----->根據元素位置找相應的元素,從1開始: root.findall("Tab[1]") root.findall("Tab[last()-1]"):找到倒數第二個元素
寫入XML文件:
調用ElementTree的write函數:ElementTree.write(file)
def pretty(e,level=0):
# 格式化xml文件
if len(e)>0:
e.text = "\n"+"\t"*(level+1)
for child in e:
pretty(child,level+1)
child.tail = child.tail[:-1]
e.tail = "\n"+"\t"*level
把如下CSV文件寫入XML文件

---》

import xml.etree.ElementTree as ET
from xml.etree.ElementTree import ElementTree,Element
import csv
def WriteXML(csvfile):
# 把CSV文件寫入到xml文件
with open(csvfile,"r") as rf:
reader = csv.reader(rf)
header = next(reader)
root = Element("Data")
for row in reader:
eRow = Element("Row")
root.append(eRow)
for tag, text in zip(header, row):
e = Element(tag.strip())
e.text = text.strip()
eRow.append(e)
pretty(root)
return ElementTree(root)
