python 解析 XML文件

jopen 8年前發布 | 19K 次閱讀 XML Python Python開發

如下使用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>

    來自: http://www.cnblogs.com/benxintuzi/p/5136476.html

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!