【问题标题】:Working with xml child objects, ElementTree in Python使用 xml 子对象,Python 中的 ElementTree
【发布时间】:2015-10-23 23:34:13
【问题描述】:

我正在使用一个程序生成的带有糟糕标记的 xml 片段。我能够解析出我正在寻找的东西,但我认为它不是非常pythonic。该程序的目标是汇总 totalLines 条目等。我正在使用 elementtree 来提取值。 寻找关于简化我的语法的建议。

xml:

<?xml version="1.0"?>
<Status name="System Status">
<Bean name="SLMHandler" cn="com.open.eventCollector.OSLMHandler">
    <Status name="SLF File manager for SODLC2">
        <Prop name="totalLines">1105413065</Prop>
    </Status>
</Bean>

<Bean name="ThreadPool" cn="com.open.util.OThreadPoolBean">
    <Prop name="minThreads">5</Prop>
    <Prop name="maxThreads">25</Prop>
    <Prop name="checkedOutThreads">3</Prop>
    <Prop name="availableThreads">2</Prop>
    <Prop name="maxIdleTime">300000</Prop>
</Bean>

<Bean name="EventCollector" cn="com.open.eventCollector.OEventCollector">
    <Prop name="numUnmatchedLines">785319</Prop>

    <Status name="Adapters">

        <Status name="Logfile_EpilogWin_Generic">
            <Prop name="linesRead">0</Prop>
        </Status>
    </Status>
</Bean>

Python:

import xml.etree.cElementTree as ET
tree = ET.parse('test.xml')
root = tree.getroot()

for bean in root.findall('Bean'):
    for status in bean.findall('Status'):
        if 'Adapters' in status.get('name'):
            for status2 in status.findall('Status'):
                for prop in status2.findall('Prop'):
                    if 'linesRead' in prop.get('name'):
                        print prop.text

【问题讨论】:

    标签: python xml xml-parsing elementtree


    【解决方案1】:

    不确定您希望如何打印最终结果,但您可以使用单个 XPath 表达式一次性完成:

    for lines in root.findall('.//Bean/Status[@name="Adapters"]/Status/Prop[@name="linesRead"]'):
        print(lines.text)
    

    为您的示例数据打印0

    【讨论】:

    • 这很好用,不幸的是,我正在使用的服务器与 Internet 完全隔离,并且只有 python 2.7,它显然不支持 xpaths。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 2017-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    相关资源
    最近更新 更多