zoukankan      html  css  js  c++  java
  • python中用ElementTree.iterparse()读取xml文件中的多层节点

      我在使用Python解析比较大型的xml文件时,为了提高效率,决定使用iterparse()方法,但是发现根据网上的例子:每次if event == 'end':之后elem.clear()或者是每次 if elem.tag == '':之后clear(),都只能去到当前标签的相关内容,如果想继续读取得到标签的子标签,则会返回为空,也就是取不到。

      其实iterparse()方法的原理是当遇到标签的“>”符号时触发start,当遇到标签的结束标志是会触发end,比如:

    <item>

      <country>

        <city></city>

        <city></city>

      </country>

    </item>

      在这个xml栗子中,用iterparse()方法捕捉end来获取标签,如果要获取<country>标签,那elem先获取的是country下的<city>标签,因为在遍历到<country>标签的结束标志</>前,先遍历到<city>的结束标志,所以elem先获取<country>标签的子标签<city>,这类似于深度优先遍历,所以如果每次if完都clear()的话,会clear掉相应标签的子标签,所以得不到其子标签。

      我尝试了各种方法来解决这个问题,后来通过这么写来实现的:

    from xml.etree import ElementTree

    for event, elem in ElementTree.iterparse(xml):
      if event == 'end':
        if elem.tag == 'name' and elem.find('children').get('name') == attr_name:

          相应标签的操作

          elem.clear()
        if ....:

          elem.clear()

      我把clear()方法放在了if里面,这样只有在找到相应标签并且读取完其子标签后再clear(),这样就可以读取子标签以及多层节点了。

      功能是实现了,但是不知道其效率有没有影响,本人菜鸟刚接触Python,还望大牛们指点。

  • 相关阅读:
    C#中判断为空
    ArcGIS中的AddIn开发示例
    当前不会命中断点,还没有加载该文档加载任何符号
    设置ArcGIS的外观改回到出厂
    读取Style符号库样式的方法
    ArcEngine中的缩放地图
    修改字段结构之GP工具
    修改字段结构之ArcGIS Diagrammer
    merage语句
    Windows下Redis的安装使用
  • 原文地址:https://www.cnblogs.com/dragonisnotghost/p/4508877.html
Copyright © 2011-2022 走看看