1. 程式人生 > >python模組-xml模組

python模組-xml模組

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>