XML文件處理 XML文件處理,有好幾種方式,這裡介紹一下xml.etree.ElementTree as ET。 註意:xml.etree.ElementTree模塊在應對惡意結構數據時顯得並不安全。 每個element對象都具有以下屬性: 1. tag:string對象,表示數據代表的種類; 2 ...
XML文件處理
XML文件處理,有好幾種方式,這裡介紹一下xml.etree.ElementTree as ET。
註意:xml.etree.ElementTree模塊在應對惡意結構數據時顯得並不安全。
每個element對象都具有以下屬性:
1. tag:string對象,表示數據代表的種類;
2. attrib:dictionary對象,表示附有的屬性;
3. text:string對象,表示element的內容;
4. tail:string對象,表示element閉合之後的尾跡;
5. 若幹子元素(child elements)。
<tag attrib1=1>text</tab>tail
1 2 3 4
創建元素的方法有Element或者SubElement(),前者稱作元素的構建函數(constructor),用以構建任一獨存的元素;後者稱作元素的製造函數(factory function),用以製造某一元素的子元素。
有了一串元素之後,使用ElementTree類來將其打包,把一串元素轉換為xml文件或者XML文件中解析出來。
若想加快速度,可以使用C語言編譯的API xml.etree.cElementTree。
在使用xml.etree.ElementTree時,一般都按如下導入:
try:
import xml.etree.ElementTree as ET
except ImportError:
import xml.etree.cElementTree as ET
XML是中結構化數據形式,在ET中使用ElementTree代表整個XML文檔,並視其為一棵樹,Element代表這個文檔樹中的單個節點。
ET對象具有多種方法從不同來源導入數據,如下:
#從硬碟的xml文件讀取數據
try: import xml.etree.ElementTree as ET except ImportError: import xml.etree.cElementTree as ET tree = ET.parse("XML文件") #載入數據 root = tree.getroot() print(root) print(root.tag) #獲取根節點
#遍歷xml文檔
try: import xml.etree.ElementTree as ET except ImportError: import xml.etree.cElementTree as ET tree = ET.parse("XML文件") #載入數據 root = tree.getroot() for child in root: #遍歷節點 print(child.tag,child.attrib)
輸出如下:
country {'name': 'Liechtenstein'}
country {'name': 'Singapore'}
country {'name': 'Panama'}
#只遍歷year 節點
try: import xml.etree.ElementTree as ET except ImportError: import xml.etree.cElementTree as ET tree = ET.parse("XML文件") #載入數據 root = tree.getroot() for node in root.iter("year"): print(node.tag,node.text)
輸出如下:
year 2008
year 2011
year 201
修改和刪除xml文檔內容
try: import xml.etree.cElementTree as ET except ImportError: import xml.etree.ElementTree as ET tree = ET.parse("XML文件") #載入數據 root = tree.getroot() #修改 for node in root.iter("year"): new_year = int(node.text) + 1 #node.text()值,屬性的值 node.text = str(new_year) node.set("update","yes") tree.write("XML文件") #修改文件之後,重新寫入文件裡面,不然修改文件是無效的 #刪除node for country in root.findall("country"): rank = int(country.find("rank").text) if rank > 50: root.remove(country) tree.write("output.xml")
文件操作中,每次修改完成數據之後,要重新寫會文件之中,不然修改文件是沒有用的。要重新寫會文件才有效果。
Element中的遍歷與查詢
Element.iter(tag=None):遍歷該Element所有後代,也可以指定tag進行遍歷尋找。
try:
import xml.etree.ElementTree as ET
except ImportError:
import xml.etree.cElementTree as ET
tree = ET.parse("XML文件") #載入數據
root = tree.getroot()
for node in root.iter():
print(node)
Element.findall(path):查找當前元素下tag或path能夠匹配的直系節點。
Element.find(path):查找當前元素下tag或path能夠匹配的首個直系節點。
Element.text: 獲取當前元素的text值。
Element.get(key, default=None):獲取元素指定key對應的屬性值,如果沒有該屬性,則返回default值。
ElementTree對象
class xml.etree.ElementTree.ElementTree(element=None, file=None) element如果給定,則為新的ElementTree的根節點。 _setroot(element):用給定的element替換當前的根節點。慎用。 # 以下方法與Element類中同名方法近似,區別在於它們指定以根節點作為操作對象。 find(match) findall(match) findtext(match, default=None) getroot():獲取根節點. iter(tag=None) iterfind(match) parse(source, parser=None):裝載xml對象,source可以為文件名或文件類型對象. write(file, encoding="us-ascii", xml_declaration=None, default_namespace=None,method="xml")
自己創建xml文檔
import xml.etree.ElementTree as ET new_xml = ET.Element("namelist") #根節點namelist name = ET.SubElement(new_xml,"name",attrib={"enrolled":"yes"}) #SubElement()子節點,new_xml的子節點 age = ET.SubElement(name,"age",attrib={"checked":"no"}) #創建子節點,name下的age節點 sex = ET.SubElement(name,"sex") age.text = '33' #寫入值,age賦值 name2 = ET.SubElement(new_xml,"name",attrib={"enrolled":"no"}) age = ET.SubElement(name2,"age") age.text = '19' et = ET.ElementTree(new_xml) #生成文檔對象 et.write("test.xml", encoding="utf-8",xml_declaration=True) ET.dump(new_xml) #列印生成的格式