thtl

导航

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>

 

posted on 2018-08-14 16:30  thtl  阅读(56)  评论(0编辑  收藏  举报