вторник, 15 мая 2012 г.

Чтение настроек программы из xml-файла.


При взаимодействии нескольких программ, требуется передавать некоторые данные, например настройки посредством файла.
Можно для этого воспользоваться обычными текстовыми файлами и разбирать их "вручную", можно задействовать ini-файлы windows, но этот подход выглядит несколько устаревшим. Наиболее современный подход - передача данных посредством xml-файла.

Допустим имеется xml-файл следующего содержания.

<?xml version="1.0" encoding="utf-8"?>
<init>
  <settings>
    <set name="Set1" value="log.txt"/>
    <set name="Set2" value="2"/>
  </settings>
  <options>
    <opt name="Opt1" value="5"/>
    <opt name="Opt2" value="True"/>
    <opt name="Opt3" value="2.71"/>
  </options>
</init>

Этот файл может создаваться/корректироваться как автоматически - как управляющей программой, так и человеком. Во всяком случае, человек всегда может просмотреть его содержимое и проконтролировать передаваемые данные.
Ниже приведена программа, позволяющая считать данные из этого файла и занести их в классы settings и options.


from xml.etree.ElementTree import ElementTree


class settings: pass
class options: pass


init = ElementTree(file='init.xml')


opts = init.find('options')
for opt in opts.findall('opt'):
    name = opt.get('name')
    try:
        value = eval(opt.get('value'))
    except:
        value = opt.get('value')
    setattr(options, name, value)


sets = init.find('settings')
for setting in sets.findall('set'):
    name = setting.get('name')
    try:
        value = eval(setting.get('value'))
    except:
        value = setting.get('value')
    setattr(settings, name, value)


for attr in dir(settings):
    if not '__' in attr: print "settings.%s = %s" % (attr, str(getattr(settings, attr)))
print
for attr in dir(options):
    if not '__' in attr: print "options.%s = %s" % (attr, str(getattr(options, attr)))



Вывод данной программы свидетельствует о правильности считывания данных:


settings.Set1 = log.txt
settings.Set2 = 2


options.Opt1 = 5
options.Opt2 = True
options.Opt3 = 2.71


Примечание. Использование функции eval небезопасно, но, если источник xml-файла надежен, это позволяет сократить код и сделать его универсальным для разных типов данных.
В другом варианте можно хранить все поля в текстовом виде, преобразуя в числовые и булевские по мере необходимости.

Комментариев нет:

Отправить комментарий