用Python编辑XML文件中的值
你好。我想为我的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吧。