Редактирование значений в XML-файле с помощью Python - PullRequest
0 голосов
/ 03 октября 2010

Эй. Я хочу иметь файл 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 ]

2 голосов
/ 03 октября 2010

Без учета преимуществ использования 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 голосов
/ 03 октября 2010

Вы можете удалить узлы, вызвав метод 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')
1 голос
/ 03 октября 2010

Взгляните на эту статью .

Но учтите приведенный выше комментарий AaronMcSmooth - это может быть неправильный подход к вашей общей проблеме.

0 голосов
/ 03 октября 2010

XML - довольно плохой способ хранения настроек конфигурации.С одной стороны, XML не совсем подходит для человека в контексте настроек.В частности, во вселенной Python лучше использовать модуль настроек (как прокомментировал @AaronMcSmooth).К сожалению, многие проекты в мире Java (неправильно?) Использовали XML для настроек, что делает его тенденцией.Я бы сказал, что эта тенденция действительно отстой.Используйте собственные настройки (модуль в Python) или что-то более дружественное к человеку, например, YAML.

0 голосов
/ 03 октября 2010

Используйте Beautifulstonesoup. Вот раздел об изменении xml:

http://www.crummy.com/software/BeautifulSoup/documentation.html#Modifying%20the%20Parse%20Tree

...