【问题标题】:Python and XML : How to filter xml elements based on attribute valuePython 和 XML:如何根据属性值过滤 xml 元素
【发布时间】:2020-06-23 01:17:58
【问题描述】:

我对 python 很陌生。

我有一个包含如下数据的 xml 文件:

<SCHEDULE type="ILN_BGY_G162_SL1D2T4T4SL2D2T4T4" inter_league="0" balanced_games="1" games_per_team="162" preferred_start_day="2">
    <GAMES>
        <GAME day="-34" time="1905" away="14" home="9" type="2" />
        <GAME day="-34" time="1905" away="16" home="11" type="2" />
        <GAME day="78" time="1905" away="12" home="15" type="2" />
        <GAME day="79" time="1905" away="6" home="8" type="2" />
    </GAMES>
</SCHEDULE>

我正在尝试删除 xml 文件中具有day 值不在列表day_range 中的所有元素day_range = [78,79,80]。使用上面的示例数据,我将删除 day="-34" 的元素并保留 day="78" 和 day="79" 的元素。

我非常仔细地遵循以下问题的答案,并得到了各种错误和不需要的结果,我将在下面解释。我尝试过的接受的解决方案:

XML Filtering with Python

How do I Filter Values From XML in Python

当我尝试以下代码时

import xml.etree.ElementTree as ET
from pathlib import Path

day_range = [78,79,80]

schedule = ET.parse(path)
root = schedule.getroot()
for element in root:
    for day in element:
        if element['day'] in day_range:
           root.remove(element)

if element['day'] in day_range: 元素索引必须是整数时出现类型错误。

如下稍微改变一下,我在root.remove(element)上得到一个ValueError:list.remove(x):x不在列表中

for element in root:
    for day in element.findall('GAME'):
        if element[0] in day_range:
            root.remove(element)
schedule.write('test.xml')

我希望输出 xml 看起来像这样:

<SCHEDULE type="ILN_BGY_G162_SL1D2T4T4SL2D2T4T4" inter_league="0" balanced_games="1" games_per_team="162" preferred_start_day="2">
    <GAMES>
        <GAME day="78" time="1905" away="12" home="15" type="2" />
        <GAME day="79" time="1905" away="6" home="8" type="2" />
    </GAMES>
</SCHEDULE>

我整天都在研究这个问题,我认为我错过了一个重要的概念,但找不到它。

【问题讨论】:

  • 请编辑您的问题,首先,修复您的 xml,因为它无效;第二澄清您是否要删除 day_range 中的天数或不在列表中的天数;添加几个要删除的元素示例和几个要保留的元素,最后根据这些示例显示您的预期输出。
  • 根据@JackFleeting 的 cmets 编辑。

标签: python xml


【解决方案1】:

下面:

import xml.etree.ElementTree as ET

xml = '''<SCHEDULE type="ILN_BGY_G162_SL1D2T4T4SL2D2T4T4" inter_league="0" balanced_games="1" games_per_team="162" preferred_start_day="2">
    <GAMES>
        <GAME day="-34" time="1905" away="14" home="9" type="2" />
        <GAME day="-34" time="1905" away="16" home="11" type="2" />
        <GAME day="78" time="1905" away="12" home="15" type="2" />
        <GAME day="79" time="1905" away="6" home="8" type="2" />
    </GAMES>
</SCHEDULE>'''

day_range = {78,79,80}

root = ET.fromstring(xml)
games = root.find('.//GAMES')
for g in games.findall('./GAME'):
    if int(g.attrib['day']) not in day_range:
        games.remove(g)
ET.dump(root)

输出

<SCHEDULE balanced_games="1" games_per_team="162" inter_league="0" preferred_start_day="2" type="ILN_BGY_G162_SL1D2T4T4SL2D2T4T4">
    <GAMES>
        <GAME away="12" day="78" home="15" time="1905" type="2" />
        <GAME away="6" day="79" home="8" time="1905" type="2" />
    </GAMES>
</SCHEDULE

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多