当前位置: 首页 > 面试题库 >

ElementTree Iterparse策略

墨星鹏
2023-03-14
问题内容

我必须处理足够大(最大1GB)的xml文档,并使用python解析它们。我正在使用iterparse()函数(SAX样式解析)。

我关注的是以下内容,假设您有一个像这样的xml

<?xml version="1.0" encoding="UTF-8" ?>
<families>
  <family>
    <name>Simpson</name>
    <members>
        <name>Homer</name>
        <name>Marge</name>
        <name>Bart</name>
    </members>
  </family>
  <family>
    <name>Griffin</name>
    <members>
        <name>Peter</name>
        <name>Brian</name>
        <name>Meg</name>
    </members>
  </family>
</families>

问题是,当然知道我何时获得姓氏(如辛普森一家)以及何时获得该家庭成员之一的姓名(例如荷马)

到目前为止,我一直在使用“开关”,它会告诉我是否在“成员”标签中,代码看起来像这样

import xml.etree.cElementTree as ET

__author__ = 'moriano'

file_path = "test.xml"
context = ET.iterparse(file_path, events=("start", "end"))

# turn it into an iterator
context = iter(context)
on_members_tag = False
for event, elem in context:
    tag = elem.tag
    value = elem.text
    if value :
        value = value.encode('utf-8').strip()

    if event == 'start' :
        if tag == "members" :
            on_members_tag = True

        elif tag == 'name' :
            if on_members_tag :
                print "The member of the family is %s" % value
            else :
                print "The family is %s " % value

    if event == 'end' and tag =='members' :
        on_members_tag = False
    elem.clear()

这很好,因为输出是

The family is Simpson 
The member of the family is Homer
The member of the family is Marge
The member of the family is Bart
The family is Griffin 
The member of the family is Peter
The member of the family is Brian
The member of the family is Meg

我担心的是,在这个(简单的)示例中,我不得不创建一个额外的变量来知道我在哪个标签(on_members_tag)中想象我要处理的真正的xml示例,它们具有更多的嵌套标签。

还要注意,这是一个简化的示例,因此可以假设我可能面对的是带有更多标签,更多内部标签的xml,并尝试获取不同的标签名称,属性等。

问题是。我在这里做些愚蠢的事吗?我觉得必须对此有一个更优雅的解决方案。


问题答案:

这是一种可能的方法:我们维护路径列表并向后窥视以找到父节点。

path = []
for event, elem in ET.iterparse(file_path, events=("start", "end")):
    if event == 'start':
        path.append(elem.tag)
    elif event == 'end':
        # process the tag
        if elem.tag == 'name':
            if 'members' in path:
                print 'member'
            else:
                print 'nonmember'
        path.pop()


 类似资料:
  • 通过定义隐藏操作菜单、配置回调地址的策略,并将策略分配给对应项目、域、全局,从而实现自定义控制前端显示菜单、显示页面等。 策略分配 策略分配即为策略设置应用范围,在应用范围内策略才会生效。 策略定义 用于自定义设置隐藏虚拟机、镜像菜单功能以及配置第三方回调地址。

  • WAF策略用于为Web应用提供集中式保护,使其免受常见攻击和漏洞的侵害。 WAF(Web Application Firewall)用于为Web应用提供集中式保护,使其免受常见攻击和漏洞的侵害。WAF可以有效识别Web业务流量的恶意特征,在对流量进行清洗和过滤后,将正常、安全的流量返回给服务器,避免网站服务器被恶意入侵导致服务器性能异常等问题,保障网站的业务安全和数据安全。 目前仅只读对接AWS、

  • 开始第一个策略 新建策略 编写Hello OpenQuant策略 导入第三方库 常用的策略事件 订单类型

  • 中文图形界面 由于 Linux 的控制台不能方便的显示中文,所以最实用的方案是“英文控制台+中文图形界面” 为了能够正常处理中文,需要使用locale-gen生成中文 locale,在/etc/locale.gen文件中添加如下内容: zh_CN.UTF-8 UTF-8 zh_CN.GB18030 GB18030 zh_CN.GBK GBK zh_CN GB2312 然后在 gdm 启动菜

  • OnStrategyStart – 在策略启动时调用,在第一笔行情到达之前 OnStrategyStop – 在策略结束时调用,在最后一笔行情之后 OnBarOpen – 在Bar行情最前沿调用(如,在日线数据开盘时买入) OnBar – 在所有行情的后沿调用(如,在日线数据收盘时买入) OnPositionOpened – 当一个新的交易开仓确认后调用 OnPositionChanged – 当

  • Solution:解决方案 Project:项目 一个解决方案下可以有多个项目,但是只有一个启动项 双击cs文件可以打开编辑代码 新建策略 在菜单栏File->New->Solution,新建一个解决方案 选择新建SmartQuant Instrument Strategy Solution模式的解决方案 Solution的类型 说明 SmartQuant Instrument Strategy

  • 主要内容:介绍,实现,Strategy.java,OperationAdd.java,OperationSubtract.java,OperationMultiply.java,Context.java,StrategyPatternDemo.java在策略模式(Strategy Pattern)中,一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为型模式。 在策略模式中,我们创建表示各种策略的对象和一个行为随着策略对象改变而改变的 context 对象。策略对象改变 contex

  • Ansible Playbooks 的集成测试 很多时候, 人们问, “我怎样才能最好的将 Ansible playbooks 和测试结合在一起?” 这有很多选择. Ansible 的设计实际上是一个”fail-fast”有序系统, 因此它可以很容易地嵌入到 Ansible playbooks. 在这一章节, 我们将讨论基础设施的集成测试及合适的测试等级. Note 这是一个关于测试你部署应用程序