Редактирование значений в 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

Другие вопросы по тегам