Python 和 XML:如何根据属性值过滤 xml 元素

杰科741

我对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" 的元素。

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

使用 Python 进行 XML 过滤

如何在 Python 中过滤 XML 中的值

当我尝试以下代码时

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:元素索引必须是整数的类型错误

如下稍微改变它,我得到一个 ValueError on root.remove(element): list.remove(x): x not in list

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>

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

巴尔德曼

以下:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章