2010-06-01 7 views
1

Я пытаюсь использовать Python для чтения в XML-файле, содержащем имена и значения параметров, например.Редактирование содержимого файла XML с помощью Python

... 
    <parameter name='par1'> 
     <value>24</value> 
    </parameter> 
    <parameter name='par2'> 
     <value>Blue/Red/Green</value> 
    </parameter> 
    ... 

, а затем передать его словарь с именами параметров { 'par1': '53', 'par2': 'Желтый/розовый/черный', ...} и соответствующие новые значения для замены старые в файле XML. Затем выход должен перезаписать исходный файл XML.

В настоящее время я конвертирую XML в словарь python и после некоторого сравнения элементов и обработки регулярных выражений записываю вывод снова в формате XML.

Я не слишком доволен этим и задавался вопросом, может ли кто-нибудь рекомендовать более эффективный способ сделать это?

Спасибо.

ответ

3

Мое первое предложение - использовать lxml или некоторые другие Python XML parser, а не использовать регулярные выражения. XML не является языком, который можно корректно анализировать с помощью регулярных выражений. (Если вы постоянно пытаетесь разобрать XML с регулярными выражениями bad things happen)

+0

Я особенно рекомендую lxml. Он включает API-интерфейс etree, который совместим с xml.etree.Elementree, но также имеет ряд полезных дополнительных функций. Единственный недостаток заключается в том, что (по-видимому) его сложно установить на некоторых платформах. У меня никогда не было никаких проблем, но я слышал эту жалобу несколько раз. –

0

Если вы читали в обеих своих старых и новых файлах XML и хранить их в виде словарей, а затем перезаписать старые значения легко - использовать update():

dict_old.update(dict_new) 

Это обновляет исходный словарь с помощью пар ключ/значение от dict_new, перезаписывая существующие ключи. Регулярные выражения не нужны, так как вы, по-видимому, хотите только совместить точные ключи.

1

xml.etree.ElementTree гораздо более pythonic, чем другие синтаксические анализаторы XML.

Пример построения dict на основе ваших данных:

>>> src = """<params> 
    <parameter name='par1'> <value>24</value> </parameter> 
    <parameter name='par2'> <value>Blue/Red/Green</value> </parameter> 
    </params> 
    """ 
>>> tree = ElementTree.XML(src) 
>>> dict(((i.attrib['name'], i.find('value').text) for i in tree.getiterator('parameter'))) 
{'par2': 'Blue/Red/Green', 'par1': '24'} 
>>> 

После изменения dict значения, построить новый ElementTree с использованием аналогичных методов, и сгенерировать файл XML с помощью метода write. Приме- чайте примеры в справочном документе, в котором показано, как изменять контент непосредственно в структуре etree. Возможно, dict не требуется.

Смежные вопросы