用Python编辑XML文件中的值

0 投票
4 回答
3748 浏览
提问于 2025-04-16 04:55

你好。我想为我的Python网页应用程序创建一个config.xml文件来存储设置。

我手动制作了一个car.xml文件,内容如下:

<car>
    <lights>
        <blinkers>off</blinkers>
    </lights>
</car>

现在我想用xml.etree.ElementTree来查看转向灯是开着还是关着。

import xml.etree.ElementTree as ET
tree = ET.parse('car.xml')
blinkers = tree.findtext('lights/blinkers')
print blinkers
> off

接下来,我想控制转向灯的开关,我该怎么做呢?

4 个回答

2

在不讨论使用XML而不是Python模块来管理配置文件的优缺点的情况下,下面是如何使用lxml来完成你所要求的事情:

>>> from lxml import etree
>>> xml = """<car>
   <lights>
      <blinkers>on</blinkers>
   </lights>
</car>"""
>>> doc = etree.fromstring(xml)
>>> elm = doc.xpath("/car/lights/blinkers")[0]
>>> elm.text="off"
>>> etree.tostring(doc)
'<car>\n   <lights>\n      <blinkers>off</blinkers>\n   </lights>\n</car>'
2

你可以通过调用父节点的 remove 方法来删除节点,想象一下就像把一个小玩具从盒子里拿出来一样。而要插入节点,可以使用 ET.SubElement 方法,就像往盒子里放一个新玩具。

import xml.etree.ElementTree as ET

def flip_lights(tree):
    lights = tree.find('lights')
    state=get_blinker(tree)
    blinkers = tree.find('lights/blinkers')
    lights.remove(blinkers)
    new_blinkers = ET.SubElement(lights, "blinkers")
    new_blinkers.text='on' if state=='off' else 'off'

def get_blinker(tree):
    blinkers = tree.find('lights/blinkers')
    return blinkers.text

tree = ET.parse('car.xml')
print(get_blinker(tree))
# off
flip_lights(tree)
print(get_blinker(tree))
# on
flip_lights(tree)
print(get_blinker(tree))
# off
flip_lights(tree)
print(get_blinker(tree))
# on
tree.write('car2.xml')
0

XML存储配置设置的方式其实不太好。首先,XML在设置方面对人类来说并不友好。特别是在Python的环境中,使用设置模块会更好(正如@AaronMcSmooth所说)。可惜的是,很多Java项目却(误?)用了XML来做设置,这让这种做法变得流行。我觉得这种趋势真的不怎么样。还是用原生的设置(在Python中是模块)或者更容易理解的格式,比如YAML吧。

撰写回答