Смущен тем, какой вариант обработки XML использовать

Я новичок в Python, и я только начал работать с разбором XML. Я немного перегружен всеми вариантами работы с XML, и я надеюсь, что опытный человек может дать мне совет (и, возможно, пример кода??) для простой проблемы, над которой я работаю.

Я работаю над простым приложением для управления контактами Python, которое не использует базу данных — информация о каждом контакте хранится в отдельном текстовом файле с использованием XML. Например, предположим, что следующее содержимое файла "1234.xml"

<contact>
<id>1234</id>
<name>Johnny Appleseed</name>
<phone>8145551212</phone>
<address>
    <street>1234 Main Street</street>
    <city>Hometown</city>
    <state>OH</state>
</address>
<address>
    <street>1313 Mockingbird Lane</street>
    <city>White Plains</city>
    <state>NY</state>
</address>
</contact>

Для примера предположим, что может быть только один номер телефона, но несколько блоков адресов.

Для того, что я здесь делаю, мне нужно иметь возможность анализировать XML из файла, вносить изменения в данные, а затем обновлять XML и сохранять его обратно в файл. Предположим, что могут произойти три типа изменений данных:

  1. изменение данных для одного или нескольких элементов, например обновление номера телефона

  2. добавление нового блока адреса (и соответствующих данных для улицы/города/штата нового адреса)

  3. удаление существующего блока адресов

Учитывая то, что я пытаюсь здесь сделать, можете ли вы порекомендовать конкретный способ сделать это? (SAX, DOM, minidom, ElementTree, что-то еще?) Мы будем очень признательны за образцы кода для всего, что вы предложите.

Спасибо!

Рон


person Ron Stanley    schedule 22.06.2011    source источник


Ответы (2)


SAX и DOM API устарели; они были в значительной степени переведены из мира Java в Python. ElementTree API был разработан специально для Pythonic, т. е. чтобы соответствовать способу решения проблем Python, так что предпочитайте его.

Самая богатая и быстрая реализация ElementTree, о которой я знаю, это lxml. Его функциональность XPath очень полезна. Непроверенный пример:

from lxml import etree

contacts = etree.parse(open("1234.xml"))

for c in contacts.xpath('//contact'):
    if c.xpath('/name')[0].text == 'Johnny Appleseed':
        c.xpath('/phone')[0].text = NEW_PHONE_NUMBER

print >> open("1234.xml", "w"), etree.tostring(contacts)
person Fred Foo    schedule 22.06.2011
comment
Спасибо! После установки XCode и lxml (сложнее, чем это должно было быть на Mac...), я смог заставить эту версию работать хорошо. Это мой первый вопрос о stackoverflow, и я очень рад быстрому ответу! - person Ron Stanley; 23.06.2011

Лучшее решение — использовать ElementTree и разбить его на набор классов, манипулировать классами и затем сериализовать их обратно в XML. Вы можете сделать это вручную, если XML действительно такой же простой, как ваш пример, или вы можете используйте какой-либо инструмент или библиотеку для создания привязок.

Работа напрямую с XML в большинстве случаев всегда заканчивается слезами или, по крайней мере, выдергиванием волос. Он также не очень удобен в сопровождении, когда XML изменяется, он обычно нарушает синтаксический анализ вашего ручного кода.

Использование решения для привязки будет более устойчивым к изменениям и его будет легче модифицировать, когда вам нужно вмешиваться вручную.

person Community    schedule 22.06.2011