Элементы или атрибуты?

В XML не существует правил о том, когда использовать атрибуты, а когда дочерние элементы.

Используем элементы или атрибуты?

Данные могут храниться как в дочерних элементах, так и в атрибутах.

Взгляните на следующие примеры:


<person sex="female">
   <firstname>Anna</firstname>
   <lastname>Smith</lastname>
</person>

<person>
   <sex>female</sex>
   <firstname>Anna</firstname>
   <lastname>Smith</lastname>
</person>

В первом примере данные о поле хранятся в атрибуте "sex". Во втором примере пол указан в дочернем элементе "sex". Оба примера предоставляют одну и ту же информацию.

Не существует каких-либо жестких правил когда использовать атрибуты, а когда элементы. Тем не менее, опыт показывает, что атрибуты удобны в HTML, однако в XML следует стараться избегать их. Если информация представляет данные, то следует использовать элементы.

Лучший способ

Следует отдавать предпочтение хранению данных в элементах.

Следующие три XML документа содержат совершенно одинаковую информацию:

В первом примере дата указана в атрибуте:


<note date="12/11/2002">
   <to>Tove</to>
   <from>Jani</from>
   <heading>Напоминание</heading>
   <body>Не забудь обо мне в эти выходные!</body>
</note>

Во втором примере дата указана в элементе:


<note>
   <date>12/11/2002</date>
   <to>Tove</to>
   <from>Jani</from>
   <heading>Напоминание</heading>
   <body>Не забудь обо мне в эти выходные!</body>
</note>

В третьем примере (наилучший вариант) для определения даты используется расширенный элемент:


<note>
   <date>
      <day>12</day>
      <month>11</month>
      <year>2002</year>
   </date>
   <to>Tove</to>
   <from>Jani</from>
   <heading>Напоминание</heading>
   <body>Не забудь обо мне в эти выходные!</body>
</note>

Избегать атрибуты

Следует ли избегать использования атрибутов?

При использовании атрибутов могут возникать некоторые проблемы:

  • атрибуты не могут содержать множественные значения (элементы могут)
  • атрибуты сложно расширять (для последующих изменений)
  • атрибуты не могут описывать структуры (элементы могут)
  • атрибуты более сложны для манипулирования программами
  • значения атрибутов сложно проверять по DTD

Если использовать атрибуты в качестве контейнеров данных, то конечные документы будут сложны для чтения и манипулирования. Для описания данных следует использовать элементы. Атрибуты следует использовать для предоставления информации, не относящейся к данным.

Никогда не используйте следующие конструкции (это пример того, как не должен выглядеть XML документ):


<note
   day="12"
   month="11"
   year="2002"
   to="Tove"
   from="Jani"
   heading="Напоминание"
   body="Не забудь обо мне в эти выходные">
</note>

Исключение к правилу использования атрибутов

У всех правил всегда есть исключения.

Для негласного правила запрета на использование атрибутов также есть одно исключение. Оно вступает в действие, когда, например, необходимо присвоить элементам идентификатор. Этот идентификатор в последствии может быть использован таким же образом, как идентификаторы в HTML. Следующий пример иллюстрирует это:


<messages>
   <note id="p501">
      <to>Tove</to>
      <from>Jani</from>
      <heading>Напоминание</heading>
      <body>Не забудь обо мне в эти выходные</body>
   </note>
   <note id="p502">
      <to>Jani</to>
      <from>Tove</from>
      <heading>Re: Напоминание</heading>
      <body>Не забуду!</body>
   </note>
</messages>

Атрибут ID в этих примерах является простым счетчиком или уникальным идентификатором, который идентифицирует разные заметки в XML файле и не является частью данных самой заметки.

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