zoukankan      html  css  js  c++  java
  • Python_xml

    xml: 可扩展标记语言,用来标记数据,定义数据类型,主要用来传输和存储数据(和json差不多,不同语言或程序之间进行数据交换的协议)

    ET(xml.etree.ElementTree)中的几个类:

    • ElementTree:表示整个xml层级结构
    • Element:表示树形结构中所有的父节点
    • SubElement:表示树形结构中所有的子节点

    xml的标签特征:

    tag 标签名称  为字符串类型
    attrib 标签属性 为字典类型,是所有属性和属性值的集合                                                        
    text 标签值 通常为字符串类型
    tail 与下一个标签之间的值 通常为字符串类型


    xml格式:

    <site>
        <name>hello</name>
        <url>yeah</url> 
    </site>
    <site>
        <name>你好</name>
        <url>嘿</url>
    </site>

    ET模块提供的几个函数:

    ET.fromstring(text)

    解析xml数据的字符串,返回一个element实例

    ET.toString(element,encoding='us-ascii',method='xml',*,short_empty_elements=True) 生成返回指定的element实例对应的包含xml数据的字符串或字节流
    encoding: 用于指定输出编码
    method :可取值‘xml’,‘heml’,‘text’,默认为xml
    short_empty_elememts : 用于控制不包含任何内容的elements格式,为True,这些标签将会被输出Wie一个单独的自关闭标签<a>,若为False,则直接输出标签对<a></a>
    ET.parse()

    解析包含xml数据的文件名或文件对象,返回一个elementTree实例

    ET.iterparse(source, events=None, parser=None) 将xml数据以递增的方式解析到元素树中,最后返回一个提供(event,elem)对的迭代器(iterator)
    events :包含要报告的事件序列,‘start’,‘end’,‘start-ns’,‘end-ns’(ns 表示获取详细的命名空间信息),若 events被省略,则仅报告‘end’事件
    parser : 可选的解析器实例,默认为标准的XMLParser解析器

    ET中的三个类:

    1.Element类

    1>.   Element 中用于操作标签属性attrib的方法(类似于字典):

    x.items() 以(name, value)对的序列返回元素所有属性,且属性在生成序列时是随机的
    x.keys() 返回该元素所有属性的名称列表(顺序随机)
    x.get(key, default=None) 获取该元素指定属性的key值
    x.set(key,value) 设置/添加该元素指定属性的值
    x.clear() 重置当前元素

    2>.  Element 中用于操作子标签(SubElement)的方法:

    append() 向最后添加一个子标签
    extends() 向最后追加多个子标签(列表的形式)
    insert(index,subelement) 向指定位置插入一个子标签
    find(match,namespaces=None) 返回第一个与match匹配的标签或None
    findall(match,namespaces=None) 返回所有与match匹配的标签
    findtext(match,default=None,namespces=None) 返回第一个与match匹配的子标签的text属性值,如果匹配到的元素没有text属性则返回一个空字符串,如果没有匹配到子标签则返回default参数定义的值
    iter(tag=None) 以当前子标签作为根创建一个树迭代器,该迭代器会以深度优先的方式迭代这个元素及其下面的元素,若tag有指定值,则从指定值开始迭代
    iterfind(match,namespaces) 查找与match参数指定的tag名称或相匹配的所有子元素,并返回迭代对象
    itertext() 创建一个迭代器,以文档顺序返回内部文本所有元素
    remove() 从当前元素中移除指定的子元素

    2.ElementTree类

    类中的方法:

    _setroot()

    以指定的元素替换当前树的根 元素,相当于把整个xml的内容替换掉

    getroot()

    返回当前树形层级结构的根 元素
    find(match,namespaces=None)

    与Element.find()相同,从根开始查找

    findtext()

    与Element.findall()相同,从根开始查找

    iter()

    为当前根标签创建并返回一个树迭代器,并顺序与tag匹配,并默认返回所有元素

    iterfind()

    与Element.iterfind()相同,从根开始查找

    parse(source,parser)

    加载一个外部xml片段到当前标签,并返回该xml的根标签

    write(file,encoding='us-ascii',xml_declaration=None,

    default_namespace=None,method='xml',*,

    short_empty_elements=Ture)

    将当前标签树以xml的形式写入文件
    default_namespace: 设置默认的xml命名空间
    xml_declaration: 用于控制是否将一个xml声明也添加到文件中(False表示添加,True表示不添加,None表示编码不是‘us-ascii’或‘utf-8’或‘Unicode’时才添加)

    创建xml:

    import xml.etree.cElementTree as ET
    
    grandfather = ET.Element('爷爷')        # 根节点
    uncle = ET.SubElement(grandfather, '大伯', attrib={'性别': ''})    # 子节点
    age = ET.SubElement(uncle, 'age', attrib={'啦啦': '木办法'})    # uncle的子节点
    work = ET.SubElement(uncle, 'work')   # age 与work同级
    child = ET.SubElement(uncle, 'child', attrib={'性别': ''})
    age.text = '45'     # 给age和name设值
    work.text = '次饭饭'
    child.text = '二丫'
    uncle2 = ET.SubElement(grandfather, '二伯', attrib={'性别': ''})
    age = ET.SubElement(uncle2, 'age')
    work = ET.SubElement(uncle2, 'work')   # work 与age同级
    child = ET.SubElement(uncle2, 'child', attrib={'性别': ''})
    age.text = '44'
    work.text = '打豆豆'
    child.text = '二蛋'
    
    
    et = ET.ElementTree(grandfather)      # 生成文档对象
    et.write('test.xml', encoding='utf-8', xml_declaration=True)    # 注释声明的xml所用编码
    # ET.dump(grandfather)   # 打印生成格式
    grandfather

    结果:

    <?xml version='1.0' encoding='utf-8'?>
    <爷爷>
        <大伯 性别="">
            <age 啦啦="木办法">45</age>
            <work>次饭饭</work>
            <child 性别="">二丫</child>
        </大伯>
        <二伯 性别="">
            <age>44</age>
            <work>打豆豆</work>
            <child 性别="">二蛋</child>
        </二伯>
    </爷爷>
    
    #######运行结果本身没有缩进#########
    test.xml

    对xml的部分操作:

    import xml.etree.cElementTree as ET
    tree = ET.parse('test.xml')            # 解析文件
    root = tree.getroot()                # 遍历节点
    print(root.tag)                      # x.tag 获取根节点名字
    
    # 遍历所有的内容
    for child in root:
        print(child.tag, child.attrib)       # 打印节点,属性
        for i in child:
            print('--->', i.tag, i.text)     # 打印节点,节点里的值(内容)
    
    # # 取一个节点的值
    # for node in root.iter('work'):        # 遍历单独某一个节点里的值(过滤year值)
    #     print(node.tag, node.text)
    #
    # # 修改(更新)一个某个节点(某个值)
    # for node in root.iter('age'):
    #     new_age = int(node.text) + 1      # 新的年份 +1
    #     node.text = str(new_age)
    #     node.set('感叹:', '老了!')        # 设置(添加)属性
    # # tree.write('xmltext.xml', encoding='utf-8',xml_declaration=True)      # 更新文件
    
    
    # 删除某一个节点
    
    # for uncle in root.findall('uncle'):         # findall() 把所有的uncle找到
    #     age = int(uncle.find('age'))   # 找到age下的内容转换为int类型
    #     if age > 44:
    #         root.remove(uncle)     # 如果满足条件的节点则删除
    # tree.write('xtext.xml', encoding='utf-8', xml_declaration=True)
    部分方法 

     另:

    除ElementTree(元素树)解析方法外,还有 SAX(simple API for xml), DOM(Document Object Model),Expat 解析xml

    参考笔记:https://www.cnblogs.com/yyds/p/6627208.html

  • 相关阅读:
    Numpy(0)
    C++(成员函数做友元)
    C++(类做友元)
    CUDA---Arrayfire---添加cuda kernel
    CUDA--Arrayfire--类型转换
    C++(友元)
    C++(const修饰成员函数)
    C++(空指针访问成员函数)
    第9章 整合前端
    第8章 离不开的数据库
  • 原文地址:https://www.cnblogs.com/Vera-y/p/9690197.html
Copyright © 2011-2022 走看看