Python:xml讀寫(xml.etree.ElementTree模組使用)
阿新 • • 發佈:2018-12-22
#!/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') #儲存