zoukankan      html  css  js  c++  java
  • xml解析模块

    XML

    XML是可扩展标记语言的缩写,是实现不同语言或程序之间进行数据交换的协议,主要可以对key添加属性. 页面做展示(字符类型的一个xml格式数据)做配置文件(内部xml格式的数据).,每一个节点都是一个element对象
    格式:

    <data>
        <country name="Liechtenstein">
            <rank updated="yes">2</rank>
            <year>2023</year>
            <gdppc>141100</gdppc>
            <neighbor direction="E" name="Austria" />
            <neighbor direction="W" name="Switzerland" />
        </country>
        <country name="Singapore">
            <rank updated="yes">5</rank>
            <year>2026</year>
            <gdppc>59900</gdppc>
            <neighbor direction="N" name="Malaysia" />
        </country>
        <country name="Panama">
            <rank updated="yes">69</rank>
            <year>2026</year>
            <gdppc>13600</gdppc>
            <neighbor direction="W" name="Costa Rica" />
            <neighbor direction="E" name="Colombia" />
        </country>
    </data>

    python解析xml

    python有三种方法解析XML,SAX,DOM,以及ElementTree:

    • SAX (simple API for XML ) python 标准库包含SAX解析器,SAX用事件驱动模型,通过在解析XML的过程中触发一个个的事件并调用用户定义的回调函数来处理XML文件。
    • DOM(Document Object Model) 将XML数据在内存中解析成一个树,通过对树的操作来操作XML。
    • ElementTree(元素树)
      ElementTree就像一个轻量级的DOM,具有方便友好的API。代码可用性好,速度快,消耗内存少。
      注:因DOM需要将XML数据映射到内存中的树,一是比较慢,二是比较耗内存,而SAX流式读取XML文件,比较快,占用内存少,但需要用户实现回调函数(handler)

      使用elementtree解析xml

      • 测试文件: War, Thriller DVD 2003 PG 10 Talk about a US-Japan war Anime, Science Fiction DVD 1989 R 8 A schientific fiction Anime, Action DVD 4 PG 10 Vash the Stampede! Comedy VHS PG 2 Viewable boredom ```
    • 解析xml

      • 使用ElementTree.XML将字符串解析为xml对象
      from xml.etree import ElementTree as ET
      
      # 打开文件,读取XML内容
      xml_str = open('test.xml','r',encoding='utf-8').read()
      
      将字符串解析成xml特殊对象,root代指xml文件的根节点
      root = ET.XML(xml_str)
      • 使用ElementTree.parse将文件直接解析问xml对象
      from xml.etree import ElementTree as ET
      
      #直接解析xml文件
      tree = ET.parse('test.xml')
      # 获取xml文件的根节点
      root = tree.getroot()
    • ElementTree常用的方法:

      • 属性

        • tag:string,元素代表的数据种类。
        • text:string,元素的内容。
        • tail:string,元素的尾形。
        • attrib:dictionary,元素的属性字典。
      • 针对属性的操作

        • clear():清空元素的后代、属性、text和tail也设置为None。
        • get(key, default=None):获取key对应的属性值,如该属性不存在则返回default值。
        • items():根据属性字典返回一个列表,列表元素为(key, value)。
        • keys():返回包含所有元素属性键的列表。
        • set(key, value):设置新的属性键与值。
      • 针对后代的操作

        • append(subelement):添加直系子元素。
        • extend(subelements):增加一串元素对象作为子元素。#python2.7新特性
        • find(match):寻找第一个匹配子元素,匹配对象可以为tag或path。
        • findall(match):寻找所有匹配子元素,匹配对象可以为tag或path。
        • findtext(match):寻找第一个匹配子元素,返回其text值。匹配对象可以为tag或path。
        • insert(index, element):在指定位置插入子元素。
        • iter(tag=None):生成遍历当前元素所有后代或者给定tag的后代的迭代器。#python2.7新特性
        • iterfind(match):根据tag或path查找所有的后代。
        • itertext():遍历所有后代并返回text值。
        • remove(subelement):删除子元素。
        • getroot():获取根节点.
    • 打印xml信息

    from xml.etree import ElementTree as ET
    
    tree = ET.parse('test.xml')
    root = tree.getroot()
    print(root.tag)           #打印根标签
    
    for i in root:
        print(i.tag,i.attrib)    #打印第二层节点的标签名称和属性
    
    for i in root.iter('format'):     #循环打印所有format的标签,并打印名字和内容
        print(i.tag,i.text)
      
      
      
      
    输出结果:
    collection
    movie {'title': 'Enemy Behind'}
    movie {'title': 'Transformers'}
    movie {'title': 'Trigun'}
    movie {'title': 'Ishtar'}
    format DVD
    format DVD
    format DVD
    format VHS
    • 修改xml内容
    from xml.etree import ElementTree as ET
    
    tree = ET.parse('test.xml')
    root = tree.getroot()
    
    for i in root.iter('year'):        #循环所有的year ,然后修改 值,并添加属性
        new_year = int(i.text) + 10
        node.txt = str(new_year)
        i.set('test','testadd')      #添加属性 test 值为testadd
    • 保存xml
    #解析xml文件方式 使用write()方法可直接保存
    tree.write("new.xml", encoding='utf-8')
    
    #解析字符串方式,需将当前root转换为
    tree = ET.ElementTree(root)
    tree.write("new.xml", encoding='utf-8')
    • 创建xml文件
    from xml.etree import ElementTree as ET
    
    #创建节点
    root = ET.Element("father")   #创建一个root根节点    
    child1 = ET.Element('child1',tag='大儿子' ,attrib={'name':'儿子1','年龄':'22'})
      #创建一个child1节点
    child2 = ET.Element('child2',tag='小儿子' ,attrib={'name':'儿子2','年龄':'10'})
       #创建一个child2街店    
    
    grandson1 = ET.Element('grandson1')  #创建一个grandson1节点
    grandson2 = ET.Element('grandson2')  #创建一个grandson2节点
    
    #节点逻辑堆加
    child1.append(grandson1)   #把grandson1加入到child1的下,成为其子节点
    child2.append(grandson2)
    
    root.append(child1)
    root.append(child2)
    
    #保存xml到文件
    tree = ET.ElementTree(root)
    tree.write('xxoo.xml',encoding='utf-8', short_empty_elements=False)
    方法1
    from xml.etree import ElementTree as ET
    
    root = ET.Element("father")
    child1 = root.makeelement('child1',{'name':'儿子1','年龄':'22'})
    child2 = root.makeelement('child2',{'name':'儿子2','年龄':'10'})
    
    grandson1 = child1.makeelement('grandson1',{})
    grandson2 = child2.makeelement('grandson2',{})
    #节点逻辑堆加
    child1.append(grandson1)   #把grandson1加入到child1的下,成为其子节点
    child2.append(grandson2)
    
    root.append(child1)
    root.append(child2)
    
    #保存xml到文件
    tree = ET.ElementTree(root)
    tree.write('xxoo.xml',encoding='utf-8', short_empty_elements=False)
    方法2
    from xml.etree import ElementTree as ET
    
    
    # 创建根节点
    root = ET.Element("father")
    
    
    # 创建大儿子
    child1 = ET.SubElement(root, " 大儿子", attrib={'name':'儿子1','年龄':'22'})
    # 创建小儿子
    child2 = ET.SubElement(root, "小儿子", attrib={'name':'儿子1','年龄':'22'})
    
    # 在大儿子中创建一个孙子
    grandson1 = ET.SubElement(child1,"grandson1")
    grandson2 = ET.SubElement(child2,"grandson2")
    
    
    et = ET.ElementTree(root)  #生成文档对象
    et.write("xxoo.xml", encoding="utf-8", xml_declaration=True, short_empty_elements=False)
    方法3

    创建的xml文档:

    <father><child1 name="儿子1" 年龄="22"><grandson1></grandson1></child1><child2 name="儿子2" 年龄="10"><grandson2></grandson2></child2></father>
    由于原生保存的XML时默认无缩进,如果想要设置缩进的话, 需要修改保存方式:
    from xml.etree import ElementTree as ET
    from xml.dom import minidom
    
    
    def prettify(elem):
        """将节点转换成字符串,并添加缩进。
        """
        rough_string = ET.tostring(elem, 'utf-8')
        reparsed = minidom.parseString(rough_string)
        return reparsed.toprettyxml(indent="	")
    
    root = ET.Element("father")
    
    child1 = root.makeelement('child1',{'name':'儿子1','年龄':'22'})
    child2 = root.makeelement('child2',{'name':'儿子2','年龄':'10'})
    
    grandson1 = child1.makeelement('grandson1',{})
    grandson2 = child2.makeelement('grandson2',{})
    
    child1.append(grandson1)
    child2.append(grandson2)
    
    root.append(child1)
    root.append(child2)
    
    #tree = ET.ElementTree(root)
    #tree.write('xxoo.html',encoding='utf-8', short_empty_elements=False)
    raw_str = prettify(root)
    
    f = open("xxoo.xml",'w',encoding='utf-8')
    f.write(raw_str)
    f.close()

    效果:

    <?xml version="1.0" ?>
    <father>
        <child1 name="儿子1" 年龄="22">
            <grandson1/>
        </child1>
        <child2 name="儿子2" 年龄="10">
            <grandson2/>
        </child2>
    </father>
  • 相关阅读:
    C# 对XML操作-实例
    XML
    得到一个随机数组的方法
    Node Redis 小试
    Hexo快速搭建静态博客并实现远程VPS自动部署
    substr.js 字符串切割
    GraphicsMagick 学习笔记
    store.js 跨浏览器的localStorage
    bodyParser中间件的研究
    Sublime Text 使用指南
  • 原文地址:https://www.cnblogs.com/pycode/p/xml.html
Copyright © 2011-2022 走看看