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,还望大牛们指点。

时间: 2024-10-09 20:10:06

python中用ElementTree.iterparse()读取xml文件中的多层节点的相关文章

Asp.Net 读取xml文件中Key的值,并且过滤掉注释内容代码

/// <summary> /// 读取配置文件keys /// </summary> /// <returns></returns> public string _GetKeys() { string filename = Server.MapPath("/") + @"web.config"; XmlDocument xmldoc = new XmlDocument(); XmlReaderSettings set

读取xml文件中的配置参数实例_java - JAVA

文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 paras.xml文件 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xm

Python——使用ElementTree解析AndroidManifest.xml文件

XML内容如下: <?xml version="1.0" encoding="utf-8" standalone="no"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.dongbao.wauoen.interappactivitytesting" platformBu

.net中读取xml文件中节点的所有属性信息

功能描述: 将数据以xml的格式记录成配置文件,需要获取配置文件中的数据时,则获取对应的配置文件,读取配置文件里对应节点的所有属性. 逻辑实现: 1.将数据配置好在xml文件中. 2.获取xml文件中所有对应的节点. 3.遍历每个节点,获取该节点所有的属性值. 4.将属性值赋到设计的节点类中. 具体实现: 实现效果

使用Spring读取xml文件中的配置信息

一般写程序时我们都会将一些配置信息写到配置文件中,以便在不修改源码的情况下对程序的某些点进行更改.这里介绍一种Spring读取xml配置文件的方式,其基本思路如下:定义一个java类,其中定义一些静态变量对应我们的配置信息,然后采用注入的方式将变量值初始化为配置值.示例代码如下: 新建一个java类: package java; public class Config { //要配置的值 public static int value = 0; //这里不能写成静态的 public void s

使用Resources 来读取xml 文件中的保存字符串的 内容 mContext.getResources().getStringArray

用上下文 得到Resource 使用mContext.getResources().getStringArray(R.array.yile_lesson2_words_mp3_array);方法得到如下xml中 包含的字符串 final String[] pictureArray = mContext.getResources().getStringArray( R.array.yile_lesson2_words_mp3_array);取得字符串的名称就可以拼凑出文件的名称 String st

解析xml文件,遍历输出xml文件中的所有节点, 最终模仿实现struts2框架

程序结构:src文件夹下存放xml文件 该文件内容: <?xml version="1.0" encoding="UTF-8"?> <mystruts> <actions name="myaction1" namespace="/"> <action name="userdao" class="org.action.UserDAO"> &l

读取XML文件中获取特定值

/// <summary>        /// 获取子系统驱动获取DCM配置文件的特定值        /// </summary>        /// <param name="configurationFile"></param>        /// <param name="key"></param>        /// <returns></returns>

C# winform 在xml文件中根据指定节点名查找节点名以及值

简单粗暴,直接上代码: XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(Help.basePath); XmlNode root = xmlDoc.SelectSingleNode("//cusBanNetList"); XmlElement timelock = xmlDoc.CreateElement("BanNetList"); timelock.InnerText = txtBanNetworkUrl.