Смущает, какой вариант обработки XML использовать - PullRequest
3 голосов
/ 22 июня 2011

Я довольно новичок в 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, что-то еще?) Примеры кода для всего, что вы предлагаете, будут очень благодарны.

Спасибо!

Рон

Ответы [ 2 ]

2 голосов
/ 22 июня 2011

API SAX и DOM старше; они были в значительной степени переведены с мира 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)
2 голосов
/ 22 июня 2011

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

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

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

...