zoukankan      html  css  js  c++  java
  • Python XML操作

    XML(可扩展性标记语言)是一种非常常用的文件类型,主要用于存储和传输数据。在编程中,对XML的操作也非常常见。

    本文根据python库文档中的xml.etree.ElementTree类来进行介绍XML的解析:https://docs.python.org/3.5/library/xml.etree.elementtree.html 

    BTW,xml.etree.cElementTree模块从3.3以后就被弃用了.

    XML格式

    首先,来看一下XML所包含的元素类型

    1. 标签 <tag>

    2. 属性 <tag  name="attribute">

    3. 数据 <data>1<data>

     例如 xml段:

    <?xml version="1.0"?>
    <data>
        <country name="Liechtenstein">
            <rank>1</rank>
            <year>2008</year>
            <gdppc>141100</gdppc>
            <neighbor name="Austria" direction="E"/>
            <neighbor name="Switzerland" direction="W"/>
        </country>
        <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>

    XML操作

    • 读取

    #从变量读取,参数为XML段,返回的是一个根Element对象
    root = ET.fromstring(country_data_as_string)
    
    #从xml文件中读取,用getroot获取根节点,根节点也是Element对象
    tree = ET.parse('file.xml')
    root = tree.getroot()
    • 访问

      • 访问Element对象的标签、属性和值
    tag = element.tag
    attrib = element.attrib
    value = element.text
      • 访问子节点
    #打印根节点的标签和属性,获取
    for child in root:
        print(child.tag, child.attrib)
    • 查找操作

      • Element元素迭代子元素:Element.iter("tag"),可以罗列该节点所包含的所有其他节点(element对象)
    #打印根节点中所有的neighbor对象的name属性
    for neighbor in root.iter('neighbor'):
        print(neighbor.attrib['name'])
      • Element.findall("tag"):查找当前元素为“tag”的直接子元素
    #findall只能用来查找直接子元素,不能用来查找rank,neighbor等element
    for country in root.findall('country'):
        rank = country.find('rank').text
        name = country.find('rank').text
        neig = country.find('neighbor').attrib
        print(rank, name,neig)
      • Element.find("tag"):查找为tag的第一个直接子元素
    #返回第一个tag为country的element,如没有,返回None
    firstCountry = root.find("country")
    print(firstCountry)
    • 创建xml文件

    __author__ = 'xua'
    
    import xml.etree.ElementTree as ET
    #创建根节点
    a = ET.Element("root")
    #创建子节点,并添加属性
    b = ET.SubElement(a,"sub1")
    b.attrib = {"name":"name attribute"}
    #创建子节点,并添加数据
    c = ET.SubElement(a,"sub2")
    c.text = "test"
    
    #创建elementtree对象,写文件
    tree = ET.ElementTree(a)
    tree.write("test.xml")

    创建的新文件内容为:<root><sub1 name="name attribute" /><sub2>test</sub2></root>

    • 修改XML文件

      • ElementTree.write("xmlfile"):更新xml文件
      • Element.append():为当前element对象添加子元素(element)
      • Element.set(key,value):为当前element的key属性设置value值
      • Element.remove(element):删除为element的节点
    #读取待修改文件
    updateTree = ET.parse("test.xml")
    root = updateTree.getroot()
    #创建新节点并添加为root的子节点
    newEle = ET.Element("NewElement")
    newEle.attrib = {"name":"NewElement","age":"20"}
    newEle.text = "This is a new element"
    root.append(newEle)
    
    #修改sub1的name属性
    sub1 = root.find("sub1")
    sub1.set("name","New Name")
    
    #修改sub2的数据值
    sub2 = root.find("sub2")
    sub2.text = "New Value"
    
    #写回原文件
    updateTree.write("test.xml")

    更新完的文件为:<root><sub1 name="New Name" /><sub2>New Value</sub2><NewElement age="20" name="NewElement">This is a new element</NewElement></root>

    总结

     XML的操作比较常见,当然也有很多第三方的库可以使用,所需要做的操作无非就是常用的读写xml文件、元素节点的增删改查,大家还可以在python官方文档上学习更多的操作。

    https://docs.python.org/3.5/library/xml.etree.elementtree.html 

  • 相关阅读:
    ubuntu安装iscsi
    函数模板的trick
    EF-Code First(5):二级缓存
    了解线程的属性及方法
    算法--中位数计算
    实习面试
    长轮询实现Chat并迁移到Azure测试
    非聚集索引及其性能优化
    架构设计方案
    大话数据结构-图
  • 原文地址:https://www.cnblogs.com/AlwinXu/p/5483177.html
Copyright © 2011-2022 走看看