XML模块
XML模块
xml模块是用来读取xml文档的,而xml这种其实标签语言,其实就是一颗倒置的树,里面有根节点,根节点下面又有一堆的节点,就是我们学的数据结构的树啦
xml原文档
<data> <country name="Liechtenstein"> <rank updated="yes">2</rank> <year updated="yes">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 updated="yes">2013</year> <gdppc>59900</gdppc> <neighbor direction="N" name="Malaysia" /> </country> <country name="Panama"> <rank updated="yes">69</rank> <year updated="yes">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_less') # 拿到的是整个xml文档的对象 root = tree.getroot() # 该xml文档对象的根节点对象 # print(root.tag) # 该根节点对象的名字 for i1 in root://标签对象是可以迭代的,迭代该根节点对象的子节点对象,得到的还是对象不可以直接输出 print(i1.tag,i1.attrib,i1.text)//tag是该标签的名字,attrib是该标签的属性,text是该标签夹着的内容 for i2 in i1: print(i2.tag,i2.attrib,i2.text) 结果 country {'name': 'Liechtenstein'} rank {'updated': 'yes'} 2 year {'updated': 'yes'} 2010 gdppc {} 141100 neighbor {'direction': 'E', 'name': 'Austria'} None neighbor {'direction': 'W', 'name': 'Switzerland'} None country {'name': 'Singapore'} rank {'updated': 'yes'} 5 year {'updated': 'yes'} 2013 gdppc {} 59900 neighbor {'direction': 'N', 'name': 'Malaysia'} None country {'name': 'Panama'} rank {'updated': 'yes'} 69 year {'updated': 'yes'} 2013 gdppc {} 13600 neighbor {'direction': 'W', 'name': 'Costa Rica'} None neighbor {'direction': 'E', 'name': 'Colombia'} None
如果不想读取全部而只是想读取其中某个标签,可以用iter()方法,在里面传入想读的标签的名字即可
import xml.etree.ElementTree as ET tree = ET.parse('xml_less') root = tree.getroot() for i1 in root: for i2 in i1.iter('year'): print(i2.tag,i2.attrib,i2.text) 结果 year {'updated': 'yes'} 2010 year {'updated': 'yes'} 2013 year {'updated': 'yes'} 2013
修改xml文档
import xml.etree.ElementTree as ET tree = ET.parse('xml_less') root = tree.getroot() for i1 in root: for i2 in i1.iter('year'): new_ = int(i2.text)+1 i2.text = str(new_)//对内容进行修改 i2.set('updated','yes')//增加新的属性 tree.write('xml_less')//覆盖原来的文档
删除某些信息
import xml.etree.ElementTree as ET tree = ET.parse('xml_less') root = tree.getroot() for i1 in root.findall('country')://在root根节点里找名字为 country 的标签 -- findall()可以找多个 if int(i1.find('rank').text) > 50://在i1节点里找 rank 的标签 -- find()只可以找一个 root.remove(i1) tree.write("xml_new.xml") 结果 删除排名高于50的国家并且将数据重新写入一个新的文件
用代码创建一个xml文档
import xml.etree.ElementTree as ET //之所以全部都要赋给一个变量是因为,你想一想我们读取xml文档时的过程,我们拿到的全都是对象,对象里本身还有 tag text attrib 等属性,所以我们自己用代码写xml文档时,也要 //将其看成一个一个的对象,所以才会有将创建的节点赋值给一个变量,而不是直接创建不赋值,当然如果不赋值也可以,例如这个 ET.SubElement(name,'age',attrib={}),返回的就 //是创建的该标签的对象,因为我们有可能用到,比如要作为 SubElement() 方法的参数 root = ET.Element('people')//创建根节点对象,并且该根节点叫做 “people” 用Element()方法 name = ET.SubElement(root,'name',attrib={'name':'djh'})//创建子节点对象,用SubElement()方法,第一个参数是放在哪个节点下,当哪个节点的子节点,第二个参数是该 //子节点标签的名字,第三个参数是该子节点的属性 age = ET.SubElement(name,'age',attrib={}) age.text='19' sex = ET.SubElement(name,'sex',attrib={'sex':'male'}) name1 = ET.SubElement(root,'name',attrib={'name':'DJH'}) age1 = ET.SubElement(name1,'age',attrib={}) age1.text = '19' sex1 = ET.SubElement(name1,'sex',attrib={'sex':'male'}) et = ET.ElementTree(root) et.write('xmlxml_new',encoding='utf-8',xml_declaration=True) 结果 <?xml version='1.0' encoding='utf-8'?> <people> <name name="djh"> <age>19</age> <sex sex="male" /> </name> <name name="DJH"> <age>19</age> <sex sex="male" /> </name> </people>