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'))

 

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時也不需要全部讀入內存。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM