• (十五)xml模块


    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的接口还主要是xml。

    xml的格式如下,就是通过<>节点来区别数据结构的:

    <?xml version="1.0"?>
    <data>                                           #父标签data
        <country name="china">                       #子标签country   属性name="china"
            <rank updated="yes">2</rank>             #子子标签rank    属性update="yes"   内容2
            <year>2018</year>
        </country>
    </data>

    xml协议在各个语言里的都 是支持的,在python中可以用以下模块操作xml:

    import xml.etree.ElementTree as et                #xml模板应该是最长的的模板了,可以用as简写为et(自定义)
    tree = et.parse('xml_lesson.xml')                 #用parse()方法来解析xml文件,拿到tree这个对象
    root = tree.getroot()                             #getroot()拿到根节点
    print(root.tag)                                   #根节点的标签:data
    
    for i in root:                                    #遍历一级子节点,即<country name='china'>
        print(i.tag)                                  #子节点的标签:country
        print(i.attrib)                               #子节点的属性:{'name': 'china'}
        print(i.text)                                 #子节点的内容:无,但实际上是一行空行,注意看下面的结果
    
        for j in i:                                   #遍历二级子节点,即<rank updated="yes">2</rank>和<year>2018</year>
            print(j.tag)                              #rank、year
            print(j.attrib)                           #{'updated': 'yes'}、{}
            print(j.text)                             #2、2018
    结果:

    data
    country
    {'name': 'china'}


    rank
    {'updated': 'yes'}
    2
    year
    {}
    2018

     也可以通过直接找节点的方式遍历:

    import xml.etree.ElementTree as et
    tree = et.parse('xml_lesson.xml')
    root = tree.getroot()
    
    for node in root.iter('rank'):              #通过root.iter()方法直接找节点的标签,无论是第几层的节点都可找到,有几个找几个
        print(node.tag,node.attrib,node.text)

    结果:rank {'updated': 'yes'} 2

    修改节点的操作:

    import xml.etree.ElementTree as et
    tree = et.parse('xml_lesson.xml')
    root = tree.getroot()
    
    for node in root.iter('year'):
        new_year = int(node.text) + 1     #node.text为字符串,需要转为int
        node.text = str(new_year)         #修改year节点的内容,需要转为str
        node.set('update','no')           #修改year节点属性,用set()方法
    tree.write('xml_lesson.xml')          #最后需要写入,这里其实是新建一个文件,如果文件名和之前相同,那就是覆盖
    结果:xml_lesson.xml变为:
    <data>
    <country name="china">
    <rank updated="yes">2</rank>
    <year update="no">2019</year>
    </country>
    </data>


     删除节点的操作:

    xml_lesson.xml为:
    <data>
        <country name="china">
            <rank updated="yes">2</rank>
            <year update="no">2019</year>
        </country>
        <country name="India">
            <rank updated="yes">47</rank>
            <year update="no">2019</year>
        </country>
    </data>

    需求:把排名高于10的国家删除

    import xml.etree.ElementTree as et
    tree = et.parse('xml_lesson.xml')
    root = tree.getroot()
    
    for country in root.findall('country'):        #findall()找到所有country节点
        rank = int(country.find('rank').text)      #在每一个country节点下面,find()找到rank节点
        if rank > 10:
            root.remove(country)                   #root.remove()删除country节点,注意不是删除rank节点
    tree.write('abc.xml')

    另一种写法:

    for country in root.iter('country'):
        for rank in country.iter('rank'):
        # rank = int(country.find('rank').text)
            if int(rank.text) > 10:
                root.remove(country)
    tree.write('222.xml')

    最后,创建xml文档:

    import xml.etree.ElementTree as ET
    
    new_xml = ET.Element("namelist")                                     #生成根节点,tag为namelist
    name = ET.SubElement(new_xml, "name", attrib={"enrolled": "yes"})    #生成一级子节点,第一个参数是上一级节点,tag为name,有一个属性
    age = ET.SubElement(name, "age", attrib={"checked": "no"})           #生产二级子节点,第一个参数是上一级节点,tag是age,有一个属性
    sex = ET.SubElement(name, "sex")                                     
    sex.text = '33'                                                      #二级子节点的内容为'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)         #写入

    结果生成的test.xml文件:

    <?xml version='1.0' encoding='utf-8'?>
    <namelist>
        <name enrolled="yes">
            <age checked="no" />
            <sex>33</sex>
        </name>
        <name enrolled="no">
            <age>19</age>
        </name>
    </namelist>
  • 相关阅读:
    Mint13的人性化改造
    [51单片机]18b20驱动函数
    应用三菱GX Developer编程软件编写SFC顺序功能图的方法
    [MATLAB]all()函数的使用
    基于RaspberryPi和Python的智能远程控制原型
    《哈佛大学公开课:幸福课》学习笔记(2)
    《哈佛大学公开课:幸福课》学习笔记(3)
    How to create a custom Ubuntu live from scratch
    网络3
    7/13/2021python 核心编程020215
  • 原文地址:https://www.cnblogs.com/xulan0922/p/10211412.html
Copyright © 2020-2023  润新知