使用Python scrip更新XML文件

2024-04-28 04:19:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个XML文件data.xml,如下所示

<?xml version="1.0"?>
<data>
<player
    name="Michael"
    id = 101
    sal=1001
    mgr="clarke" />
<player
    name="Ricky"
    id = 102
    sal=1002
    mgr="Ponting" />
<player
    name="Shane"
    id = 103
    sal=1003
    mgr="Warne" />
<player
    name="Watson"
    id = 104
    dept="Batsman"
    sal=1004
    mgr="Shane" />
<player
    name="Nathon"
    id = 105
    dept="Bowler"
    sal=1005
    mgr="Lyon" />
</data>

我怎样才能:

  • dept = "Batsman"更新所有没有dept属性的emp

  • 用默认值dept = "cricketers"

    更新所有emp
  • 更新选定的电磁脉冲(选定的电磁脉冲将在另一个players.txt 文件)与dept = "Cricketers"

players.txt将是一个纯文本文件,只有玩家的名字,如:

Michael
Ricky
Shane
Watson

Tags: 文件nameiddataxmlwatsonplayermgr
1条回答
网友
1楼 · 发布于 2024-04-28 04:19:16

使用minidom就足够了, 但是首先,xml的格式是不正确的,因为attributes must be quoted

不管怎样,解决了这个问题,您只需要解析xml

from xml.dom import minidom
xmldoc = minidom.parse('data.xml')

然后,这3个任务中的每一个都略有不同,它们共同检查xml中的player标记,并检查这些标记的属性。你知道吗

所以

update all the emps who do not have dept attribute with dept = "Batsman"

只需检查所有播放器的"dept"属性,设置抛出KeyValue异常的播放器,因为从xml解析的dict没有该键:

for p in xmldoc.getElementsByTagName("player"):
    try:
        p.attributes["dept"]
    except KeyError:
        p.attributes["dept"] = "Batsman"

Update all the emps with a default dept = "cricketers"

与上一个相同,但适用于所有玩家

for p in xmldoc.getElementsByTagName("player"):
    p.attributes["dept"] = "cricketers"

Update selected emps (selected emps will be in another players.txt files) with dept = "Cricketers"

对于这个,可以先将文件的每一行加载到一个列表中

p_names = [line.rstrip('\n') for line in open("players.txt")]

然后,与前面一样,检查属性名称值是否显示在预加载列表中。你知道吗

for p in xmldoc.getElementsByTagName("player"):
    if p.attributes["name"].value in p_names:
        p.attributes["dept"] = "Cricketers"

相关问题 更多 >