python 解析 XML文件
如下使用xml.etree.ElementTree模塊來解析XML文件。ElementTree模塊中提供了兩個類用來完成這個目的:
- ElementTree 表示整個XML文件(一個樹形結構)
- Element 表示樹中的一個元素(結點)
我們操作如下XML文件: migapp.xml
我們可以通過如下方式導入ElementTree模塊: import xml.etree.ElementTree as ET
或者也可以僅導入parse解析器: from xml.etree.ElementTree import parse
首先需要打開一個xml文件,本地文件使用open函數,如果是互聯網文件,則使用urlopen:
f = open( ' migapp.xml ' , ' rt ' , encoding= ' utf-8 ' )
然后對XML進行解析。
1 解析XML文件
1.1 解析根元素
tree = ET.parse(f) root = tree.getroot() print('root.tag =', root.tag) print('root.attrib =', root.attrib)
1.2 解析根的兒子
for child in root: # 僅可以解析出root的兒子,不能解析出root的子孫 print(child.tag) print(child.attrib) # attrib is a dict
1.3 通過索引解析根的子孫
print(root[1][1].tag) print(root[1][1].text)
1.4 迭代解析出所有的指定element
for element in root.iter('environment'): print(element.attrib)
1.5 幾個有用的方法
# element.findall()解析出指定element的所有兒子element.find()解析出指定element的第一個兒子
element.get()解析出指定element的屬性attrib
for environment in root.findall('environment'): first_variable = environment.find('variable') print(first_variable.get('name'))</pre>
![]()
2 修改XML文件
假設我們需要給每個text元素添加一個屬性size="50",修改其text為"Benxin Tuzi",添加一個子元素date="2016/01/16"
for text in root.iter('text'): text.set('size', '50') text.text = 'Benxin Tuzi' text.append(ET.Element('date', attrib={}, text='2016/01/16')) tree.write('output.xml')migapp.xml 中的部分:
![]()
output.xml 中對應的部分:
![]()
3 說明事項
- 不要使用xml.py作為文件名,否則此時會發生如下錯誤:
ImportError: No module named 'xml.etree'; 'xml' is not a package
分析:
這是由于import時會先在當前路徑下尋找,此時發現存在xml.py模塊,而我們自己寫的xml.py當然不是一個package
注意:
刪除xml.py后仍然不能成功解釋,那是因為當前路徑中還生成了xml.pyc,而該文件的優先級要高于xml.py,因此解釋器還是優先在xml.pyc中尋找,因此必須將該文件也刪除掉,成功解決問題。
結論:
文件名盡量不要與包名或者模塊名同名,即使你在腳本中不使用該模塊或者包,否則可能發生奇怪的錯誤。
- ElementTree模塊中提供的很多解析函數都需要預先將整個XML文檔讀入內存中,這對于大型XML解析而言,不是一件好事,尤其是當我們從網絡、管道中讀取XML時,非阻塞式的解析非常重要。此時,我們可以使用ElementTree模塊中的XMLPullParse類來處理。當然我們也可以選擇ElementTree模塊的iterparse()來代替,該方法在解析大型XML時也不需要全部讀入內存。
</ul> </div>