zoukankan      html  css  js  c++  java
  • python xml.etree.ElementTree模块

    使用的XML文件如下:file.xml

    <?xml version="1.0"?>
    <data name="ming">
        <country name="Singapore">
            <rank>4</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor name="Malaysia" direction="N"/>
        </country>
        <country name="Panama">
            <rank>68</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor name="Costa Rica" direction="W"/>
            <neighbor name="Colombia" direction="E"/>
        </country>
    </data>

    导入模块

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/11/30 0030 18:18
    # @Author  : ming
    import xml.etree.ElementTree as ET

    读取文件

    result = ET.parse("file.xml")  # 打开文件
    root = result.getroot()  # 获取根节点

    打印一下根节点信息

    print(root.tag, root.attrib)  # 根节点标签和属性值
    #运行结果:data {'name': 'ming'}

    打印一下根节点的孩子节点

    for i in root:  # 循环根节点的孩子节点
        print(i.tag, i.attrib)  # 打印孩子节点的标签和属性值
        print(i[0].tag, i[0].text)  # 打印孙子节点中第一个节点的标签和属性值。多层节点都可以通过下标访问
    # 运行结果:
    # country {'name': 'Singapore'}
    # rank 4
    # country {'name': 'Panama'}
    # rank 68

    findall 直接定位节点

    for k in root.findall('country'):  # 直接定位该节点
        print(k.tag, k.attrib)  # 打印孩子节点的标签和属性值
        print(k[1].tag, k[1].text)  # 打印孙子节点中第一个节点的标签和属性值。多层节点都可以通过下标访问
    #运行结果
    # country {'name': 'Singapore'}
    # year 2011
    # country {'name': 'Panama'}
    # year 2011

     iter 遍历所有节点

    for m in root.iter():  # 遍历所有节点
        print(m.tag, m.attrib, m.text)  # 打印所有节点的标签、属性、值
    data {'name': 'ming'} 
        
    country {'name': 'Singapore'} 
            
    rank {} 4
    year {} 2011
    gdppc {} 59900
    neighbor {'name': 'Malaysia', 'direction': 'N'} None
    country {'name': 'Panama'} 
            
    rank {} 68
    year {} 2011
    gdppc {} 13600
    neighbor {'name': 'Costa Rica', 'direction': 'W'} None
    neighbor {'name': 'Colombia', 'direction': 'E'} None
    运行结果

    iter 遍历特定的节点,不遍历子节点

    for p in root.iter("country"):  # 遍历所有country节点自身,不遍历子节点
        print(p.tag, p.attrib)  # 打印所有country节点的标签、属性
    #运行结果
    # country {'name': 'Singapore'}
    # country {'name': 'Panama'}

    find 查找第一个匹配的节点

    firstCountry = root.find("country")  # 返回第一个tag为country的element,如没有,返回None
    print(firstCountry.attrib)  # 第一个country节点的属性值
    # 运行结果
    # {'name': 'Singapore'}

    append 增加一个新的节点

    newEle = ET.Element("Newtag")  # 新节点的标签
    newEle.attrib = {"name": "NewElement", "age": "20"}  # 新节点的属性
    newEle.text = "This is a new element"  # 新节点的值
    # a = root.find("country")  # 第一个country节点
    # a.append(newEle)  # 在第一个country中添加
    #
    # root[0].append(newEle)  # 根节点中第一个子节点下添加
    root.append(newEle)  # 把这个新节点放在哪个节点下,这里的root代表根节点
    result.write("file.xml")  # 写回原文件
    <data name="ming">
        <country name="Singapore">
            <rank>4</rank>
            <year>2011</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia"/>
        </country>
        <country name="Panama">
            <rank>68</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica"/>
            <neighbor direction="E" name="Colombia"/>
        </country>
        <Newtag age="20" name="NewElement">This is a new element</Newtag>
    </data>
    运行结果

    修改节点信息

    # 修改节点属性
    sub1 = root.find("country")
    sub1.set("name", "Chinese") # 修改name=chinese
    result.write("file.xml")  # 写回原文件
    
    # 修改节点值
    sub2 = root.find("country")
    sub2.find("year").text = "2018" #修改year的值为2018
    result.write("file.xml")  # 写回原文件
    <data name="ming">
        <country name="Chinese">
            <rank>4</rank>
            <year>2018</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        <country name="Panama">
            <rank>68</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica" />
            <neighbor direction="E" name="Colombia" />
        </country>
    </data>
    View Code

    删除节点

    sub3 = root.find("country")
    root.remove(sub3)
    result.write("file.xml")  # 写回原文件
    <data name="ming">
        <country name="Panama">
            <rank>68</rank>
            <year>2011</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica"/>
            <neighbor direction="E" name="Colombia"/>
        </country>
    </data>
    运行结果

     创建新的XML文件

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    # @Time    : 2017/12/2 0002 14:44
    # @Author  : ming
    
    import xml.etree.ElementTree as ET
    
    # 创建一个新的XML文件,根节点为yangyongming
    new_xml = ET.Element("yangyongming")
    
    # 孩子节点为name,指点父亲节点为new_xml sttrib属性
    new_1 = ET.SubElement(new_xml, "name", attrib={"name": "hello"})
    
    # 孙子节点sex 父亲节点new_1
    new_s1 = ET.SubElement(new_1, "sex")
    # 孙子节点sex 赋值"man"
    new_s1.text = "man"
    # 孙子节点 age, 父亲节点new_1
    new_s2 = ET.SubElement(new_1, "age")
    # 孙子节点age 赋值“18”
    new_s2.text = "18"
    
    # 转换为XML文件,写入文件
    et = ET.ElementTree(new_xml)
    et.write("file.xml", encoding="utf-8")
    <yangyongming>
        <name name="hello">
            <sex>man</sex>
            <age>18</age>
        </name>
    </yangyongming>
    运行结果
  • 相关阅读:
    从零开始PHP学习
    从零开始PHP学习
    从零开始PHP学习
    从零开始PHP学习
    从零开始PHP学习
    [暂停一天]从零开始PHP学习
    [Laravel 5] 表单验证 Form Requests and Controller Validation
    JQuery 在$(window).load() 事件中 不运行 $(window).resize()
    JS计算两个日期相差几天
    python 学习之Windows 下的编码处理!
  • 原文地址:https://www.cnblogs.com/ming5218/p/7943602.html
Copyright © 2011-2022 走看看