Какой стиль XML лучше при работе с ним с ElementTree Python? - PullRequest
2 голосов
/ 01 октября 2010

Я бы хотел хранить некоторые относительно простые вещи в XML каскадным способом. Идея состоит в том, что сборка может иметь несколько наборов параметров, а скрипты Python создают необходимые артефакты сборки (* .h и т. Д.), Читая эти наборы, и если два набора имеют одинаковый параметр, последний заменяет первый.

Существует (как минимум) два разных способа создания XML:

Первый способ:

<Variants>
<Variant name="foo" Info="foobar">1</Variant
</Variants>

Второй способ:

<Variants>
<Variant>
<Name>Foo</Name>
<Value>1</Value>
<Info>foobar</Info>
</Variant>
</Variants>

Какой из них легче обрабатывать в ElementTree. Мое ограниченное понимание утверждает, что это был бы первый вариант, поскольку я мог бы легко найти вариант с помощью find () и получить все поддерево, но будет ли так же легко сделать это со вторым стилем? Мой коллега говорит, что последний XML лучше, так как он позволяет более легко расширять XML (и он, очевидно, прав), но я не считаю расширяемость важным фактором в данный момент (вполне может быть, он нам никогда не понадобится).

РЕДАКТИРОВАТЬ: Конечно, я мог бы использовать lxml, имеет ли это значение в этом случае? Скорость на самом деле не проблема, файлы относительно небольшие.

Ответы [ 2 ]

3 голосов
/ 01 октября 2010

Вы оба правы, но я бы выбрал № 1, где это возможно, за исключением текстового содержания:

  • 1 гораздо более лаконичен и удобочитаем, поэтому меньше ошибоксклонный.

  • Полная расширяемость: YAGNI .YAGNI не всегда верен, но если вы уверены, что вам не понадобится расширяемость, не жертвуйте другими преимуществами ради расширяемости.
  • 1 все еще довольно расширяем.Вы всегда можете добавить больше атрибутов или дочерних элементов.Единственный способ, по которому он не расширяется, - это если позже вы обнаружите, что вам нужно несколько значений для name или info (или значение текстового содержимого) ... поскольку вы не можете иметь несколько атрибутовс тем же именем на элементе (ни с несколькими узлами текстового содержимого без чего-то промежуточного).Однако вы все равно можете расширить их с помощью различных методов, например, разделенных пробелами значений в атрибуте или добавления дочерних элементов в качестве альтернативы атрибуту.

  • Я бы превратил «значение» в атрибут илидочерний элемент, а не с использованием текстового содержимого.Если вам когда-нибудь понадобится добавить дочерний элемент, и у вас будет этот текстовый контент, вы получите смешанный контент (текст в качестве родственного элемента), который становится беспорядочным для обработки.

Обновление: дальнейшее чтение

Несколько хороших статей об обсуждении XML-элементов-атрибутов, в том числе о том, когда использовать каждый из них:

См. Также этот вопрос SO (но я думаю, что приведенное выше дает более выгодное чтение).

1 голос
/ 01 октября 2010

Помните о критических ограничениях на атрибуты XML:

  • Имена атрибутов должны быть именами XML.
  • Элемент может иметь только один атрибут с заданным именем.
  • Порядок атрибутов не имеет значения.

Другими словами, атрибуты представляют пары ключ / значение. Если вы можете представить его в Python как словарь, ключи которого являются именами XML, а значения - строками, вы можете представить его в XML как набор атрибутов, независимо от того, что это «оно».

Если вы не можете - если, например, порядок значим, или вам нужно значение для включения дочерних элементов - тогда вы не должны использовать атрибуты.

...