6 советов по проектированию XML документа

Приведу небольшой список правил, на которые можно разумно ориентироваться при проектировании новой XML структуры. Это конечно не «истина в последней инстанции», и есть куча случаев когда некоторые из них совсем не подойдут, но в общем виде, как ориентир, ознакомится следует, чтобы не плодить xml документы с которыми невозможно работать.

1. Используйте атрибуты для одной группы

Выносите короткие значения из одной группы в атрибуты.
Лучше

<user name="John" sname="Smith"/>

чем

<user>
 <name>John</name>
 <sname>Smith</sname>
</user>

2. Используйте CamelCase

Лучше всего lowerCamelCase, хотя достаточно распространен вариант с UpperCamelCase для элементов и lowerCamelCase для атрибутов.

3. Не используйте разделители

Это конечно входит в совет по CamelCase, но скажу отдельно: не надо разделять слова с помощью тире или подчеркивания.
Вместо

<user_name>foo</user_name>

пишите

<userName>foo</userName>

4. Не используйте лишнюю нумерацию

Если подразумевается что у элемента будет всегда несколько детей, то не надо их описывать как child1, child2 и т.д., опишите как они есть их позиция и будет этим номером. Для XSLT проще проверить функцию position (), чем делать всякие хаки для перехвата таких элементов. В крайнем случае можно добавить атрибут и именем index/position/x/и т.д. Работать с таким документом гораздо проще.
Вместо

<user>
  <phone1>1234567890</phone1>
  <phone2>0123456789</phone2>
  <cell1>12</cell1>
  <cell3>927</cell3>
</user>

напишите

<user>
  <phone>1234567890</phone>
  <phone>0123456789</phone>
  <cell index="1">12</cell>
  <cell index="3">927</cell>
</user>

5. Не надо тематических префиксов/окончаний

Не нужно всех эти firstItem + secondItem, workPhone + homePhone и пр. Все также как и в предыдущем пункте, нужно вынести все это в атрибут, например type:

<client>
 <phone type="home">1234567890</phone>
 <phone type="work">0123456789</phone>
</client>

6. Опишите похожие структуры одинаковым элементом

Многие различные элементы можно сократить до одного универсального. К примеру если элементы имеет множество однотипных подэлементов «параметров», то можно сократить их до вида:

<property name="xxx">value</property>

или

<property name="xxx" value="value"/>

Т.е вместо:

<user>
 <src>1</src>
 <load>Y</load>
</user>

написать

<user>
<property name="src" value="1"/>
<property name="load" value="Y"/>
</user>

Не факт что получится сэкономить на объеме кода, даже наоборот, но обрабатывать опять же проще будет. В данном случае нужно выборочно подходить, в зависимости от назначения документа, от того как его обрабатывать. И не надо перегибать палку, а то таким образом весь документ можно описать, построчно.

И напоследок: напишите XSD/DTD

И все таки надо описывать структуру, ну хоть в базовом виде. Пример примером, но как дойдет дело до реального использования, до интеграции разных частей — начнутся проблемы. Даже с совсем базовым XSD хоть как то можно валидировать, в конце концов от опечаток спасет.