python模組-xml模組
阿新 • • 發佈:2018-11-19
xml是實現不同語言或程式之間資料交換的協議,類似json,比json出現得更早。
如下一個名為xml_test的檔案,下面的操作都對這個檔案進行
<date>和</date>、<country>和</country>、<year>和</year>等成對出現的為非閉合標籤,而<neighbor>是自閉合標籤,自閉合標籤沒有值也沒有子標籤
<data> <country name="Liechtenstein"> <rank updated="yes">2</rank> #rank為標籤tag,update為標籤的屬性attribute,yes為屬性的值,2為標籤的值text <year>2010</year> <gdppc>141100</gdppc> <neighbor direction="E" name="Austria" /> <neighbor direction="W" name="Switzerland" /> </country> <country name="Singapore"> <rank updated="yes">5</rank> <year>2013</year> <gdppc>59900</gdppc> <neighbor direction="N" name="Malaysia" /> </country> <country name="Panama"> <rank updated="yes">69</rank> <year>2013</year> <gdppc>13600</gdppc> <neighbor direction="W" name="Costa Rica" /> <neighbor direction="E" name="Colombia" /> </country> </data>
匯入xml模組並獲取根節點
import xml.etree.ElementTree as ET #匯入模組名稱較長時可以取別名 tree = ET.parse("xml_lesson") #獲取根節點 root = tree.getroot() #獲取根節點標籤 print(root.tag)
遍歷整個文件
for child in root: print(child.tag, child.attrib) #獲取子節點標籤、屬性 for i in child: print(i.tag, i.attrb, i.text) #獲取子節點的子節點的標籤、屬性和值
只遍歷year節點
for node in root.iter('year'): print(node.tag, node.text)
修改year節點
for node in root.iter('year'): new_year = int(node.text) + 1 #將year節點的值轉換為int,再加1 node.text = str(new_year) #將上述計算得到新的值轉換為字串重新賦給year節點的值 node.set("updated", "yes") #給year節點增加屬性update,屬性值為yes tree.write("xml_test") #將上述修改和增加寫入文件,此處可寫入一個新的文件,也可寫入原文件
刪除指定節點
for country in root.findall('country'): #查詢root下的所有country節點 rank = int(country.find('rank').text) #查詢country節點下的rank節點,並獲取rank節點的值 if rank > 50: root.remove(country) #如果節點的值大於50,則刪除整個country節點 tree.write('output.xml') #將上述操作寫入文件
通過python語句生成xml文件
import xml.etree.ElementTree as ET new_xml = ET.Element("namelist") #生成名為new_xml的文件,根節點標籤為namelist name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"}) #生成new_xml的子節點,子節點標籤為name,屬性為enrolled,屬性值為yes age = ET.SubElement(name, "age", attrib={"checked": "no"}) #生成name的子節點,標籤為age,屬性為checked,屬性值為no sex = ET.SubElement(name, "sex") #生成name的子節點,標籤為sex sex.text = '33' #set標籤的值為‘33’ 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) # 列印生成的格式
通過上述命令生成的new_xml檔案的內容如下
<namelist> <name enrolled='yes'> <age checked='no'> <sex>33</sex> </name> <name enrolled='no'> <age>19</age> </name> </namelist>