1. 程式人生 > >Python:xml讀寫(xml.etree.ElementTree模組使用)

Python:xml讀寫(xml.etree.ElementTree模組使用)

#!/usr/bin/env python
# coding:UTF-8


"""
@version: python3.x
@author:曹新健
@contact: [email protected]
@software: PyCharm
@file: xml.etree.ElementTree模組使用.py
@time: 2018/11/14 14:34
"""

"""
1、ElementTree例項代表整個XML樹,可以使用getroot()來獲取根節點。Element表示樹上的單個節點,它是
   iterable的。操作整個XML文件時使用ElementTree類,比如讀寫XML檔案。操作XML元素及其子元素時使用
   Element類。
2、xml.etree.cElementTree是用C語言實現的模組,介面上與xml.etree.ElementTree完全相同,然而處理效率
   更快,但並不是所有平臺均支援,因為我們可以嘗試匯入,若沒有就匯入ElementTree

3、每個元素包含如下屬性:
  tag:string物件,表示資料代表的種類。
  attrib:dictionary物件,表示附有的屬性。
  text:string物件,表示element的內容。
  tail:string物件,表示element閉合之後的尾跡。
  若干子元素(child elements) 

4、查詢方法:
    Element.findall(match)方法通過tag名字或xpath匹配第一層子元素,按照子元素順序以列表形式返回所有
    匹配的元素。 
    Element.find(match)方法通過tag名字或xpath在第一層子元素中查詢第一個匹配的元素,返回匹配的元素
    或None。 
    Element.get(key, default=None)返回元素名字為key的屬性值,如果沒有找到,返回None或設定的預設值。

5、通過Element物件的方法修改Element物件
    Element.text=value可以直接修改其text屬性。
    Element.tail=value可以直接修改其tail屬性。
    Element.set(key, vlaue)可以新增新的attrib。
    Element.append(subelement)可以新增新的子元素。
    Element.extend(subelements)新增子元素的列表(引數型別是序列)。
    Element.remove(subelement)可以刪除子元素

6、使用ET.SubElement(parent, tag_name)可以快速建立子元素關係,使用ET.dump(elem)可以輸出elem的內容
   到標準輸出(elem可以是一個Element物件或ElementTree物件)
   
7、ET.parse(filename)一次性將整個XML檔案載入到記憶體,ET.iterparse(filename)採用增量形式載入XML資料,
   佔據更小的記憶體空間。
"""
try:
    import xml.etree.cElementTree as ET
except ImportError:
    import xml.etree.ElementTree as ET

tree = ET.parse("country_data.xml")
root = tree.getroot()

"""
ET.dump(root)
print(root.tag)
print(root.attrib)
print(root.text.strip())
print(root.tail)
tree.findall('country/*')  //查詢孫子節點元素
tree.findall('.//rank')  //查詢任意層次元素
tree.findall('country[@name]')   // 包含name屬性的country
tree.findall('country[@name="Singapore"]')   // name屬性為Singapore的country
tree.findall('country[rank]')   // 孩子元素中包含rank的country
tree.findall('country[rank="1"]')   // 孩子元素中包含rank且rank元素的text為1的country
tree.findall('country[1]')     // 第一個country
tree.findall('country[last()]')   // 最後一個country
tree.findall('country[last()-1]')    // 倒數第二個country
"""

#遍歷子節點
def getChild(elment,indent=""):
    indent = indent
    for child in elment:
        if child.text:
            print(indent,child.tag,child.attrib,child.text.strip(),root.tail)
        else:
            print(indent,child.tag, child.attrib, None, root.tail)

        getChild(child,indent + "    ")

getChild(root)

print("*"*40)

for node in tree.findall('country/year'):
     print(node.tag,node.text)
     node.tag = "newyear"
     node.text = "2018"
     print(node.tag,node.text)
     node.tag = "year"

tree.write('country_data.xml') #儲存