Редактирование значений в XML-файле с помощью Python
Привет. Я хочу иметь файл config.xml для настроек в веб-приложении Python.
Я сделал 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
Теперь я хочу включить и выключить поворотники, как я могу это сделать?
5 ответов
XML - довольно плохой способ хранения настроек конфигурации. С одной стороны, XML не совсем подходит для человека в контексте настроек. В частности, во вселенной Python лучше использовать модуль настроек (как прокомментировал @AaronMcSmooth). К сожалению, многие проекты в мире Java (неправильно?) Использовали XML для настроек, что делает его тенденцией. Я бы сказал, что эта тенденция действительно отстой. Используйте собственные настройки (модуль в Python) или что-то более дружественное к человеку, например, YAML.
Вы можете удалить узлы, вызвав родительский узел 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')
Не обращая внимания на преимущества использования 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>'
Посмотрите на эту статью.
Но учтите комментарий AaronMcSmooth выше - это может быть неправильный подход к вашей общей проблеме.
Используйте Beautifulstonesoup. Вот раздел об изменении XML:
http://www.crummy.com/software/BeautifulSoup/documentation.html