Какой из них выбрать: атрибут XML или подузел?


15

Мы хотим экспортировать некоторые данные из нашей базы данных в виде XML. Например, Personможет быть age, nameи некоторые другие свойства.

У нас есть два варианта определения формата XML.

Выбор № 1:

<Persons>
   <Person>
       <Age>16</Age>
       <Name>Richard</Name>
   </Person>
   <Person>
       <Age>34</Age>
       <Name>Eric</Name>
   </Person>
   ...
</Persons>

Выбор № 2:

<Persons>
   <Person Age="16" Name="Richard"/>
   <Person Age="34" Name="Eric"/>
   ...
</Persons>

Так в чем же разница между определением подузла или атрибута? И в чем выгода каждого выбора?



2
Хотя об этом было сказано в 2008 году о переполнении стека , это, похоже, является дизайнерским решением и обсуждается здесь.
Томас Оуэнс

Ответы:


9

Для этого нет четкой документации / передовой практики, но рассмотрите альтернативы, как у вас есть:

Как текст элемента:

  • может быть проще отобразить данные в формате xhtml и т. д., где текстовое содержимое считается текстом, а не разметкой или метаданными.
  • может быть больше чем один. Если вам нужен дочерний контент с несколькими строками возраста или имени, атрибуты этого не позволят
  • если вам нужны метаданные на уровне строк, у вас есть возможность использовать атрибуты <name>или <age>для этой цели

Как атрибуты:

  • XML более компактен
  • XSLT и DocTypes проще указать
  • вам не нужно беспокоиться о пробелах (отступы, отступы, разрывы строк) или других элементах, которые могут быть введены (комментарии, PI) в области PCDATA (текст элемента)
  • может быть только один! вам не нужно беспокоиться о дочернем контенте, содержащем несколько ageатрибутов.

Я потратил много времени на работу с XML, и, по моему мнению, для передачи данных в чистом виде атрибуты должны использоваться по возможности. Если XML, вероятно, будет использоваться для представления (XSLT, xhtml и т. Д.), Он может быть лучше в виде текстового содержимого (но не обязательно).


2
Ничего не стоит: если вы собираетесь использовать XSLT, буквально нет причин НЕ использовать атрибуты. Может быть, если вы собираетесь делать что-то XML + CSS, или вы собираетесь использовать чужой XSLT ...
DougM

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

9

Принципы разработки XML: когда использовать элементы против атрибутов от Uche Ogbuji из IBM, вероятно, является одним из лучших ресурсов по этому вопросу.

В основе решения лежит то, что атрибуты являются «выполненными» вещами. Вы не можете изменить их или изменить их или вложить их. Они не зависят от порядка и различны внутри элемента (вы не можете иметь две одинаковые вещи).

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

В вашем примере у вас есть человек, у которого есть имя и возраст. У меня есть имя, отчество и фамилия ... и псевдоним. А у некоторых людей есть девичьи фамилии, несколько отчеств или почетные звания - как бы вы включили Джона Рональда Ройеля Толкина в такую ​​структуру?

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

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

С другой стороны, возраст - это то, что имеет довольно фиксированную структуру (я бы предложил день рождения, а не целое число). Таким образом, представление этой информации в хорошо известном и понятном формате имеет смысл в атрибуте. У человека есть один и только один день рождения, и нет «заказа» на него, который вы хотите сохранить.

Уче Огбуджи определяет три основных принципа правильной разработки формата xml. Ниже приведены сокращенные цитаты из вышеуказанного связанного документа.

  • Принцип структурированной информации
    Если информация выражена в структурированной форме, особенно если структура может быть расширяемой, используйте элементы. С другой стороны: если информация выражена как атомарный токен, используйте атрибуты
  • Принцип читабельности
    Если информация предназначена для чтения и понимания человеком, используйте элементы. Если информация легче всего понять и переварить на машине, используйте атрибуты.
  • Принцип привязки элемента / атрибута
    Используйте элемент, если вам нужно изменить его значение другим атрибутом

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

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


2

Еще одно соображение, кроме числа Рольфля, - количество полей.
Более чем небольшое количество атрибутов становится беспорядком и трудным для чтения (это предполагает, что вы хотите, чтобы ваш xml был удобочитаемым для человека, но как программист вы захотите сделать это как минимум для тестирования).

Кроме того, если вы ожидаете, что структура данных одного из полей со временем изменится, не делайте это атрибутом.
Например, ваше имя поля. Может быть, в будущем это станет

<name>
  <firstName>George</firstName>
  <lastName>Orwell</lastName>
  <maidenName></maidenName>
  <nickName>Robert</nickName>
</name>

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


спасибо за этот хороший момент. И почему «сделать его атрибутом означает больше рефакторинга кода позже»?
ZijingWu

2

Для тега Persons обычно имеет больше тегов Person, это имеет смысл, в списке Person есть некоторые сущности, а не атрибуты.

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

Если мы думаем в контексте HTML, у вас нет ввода с тегом имени со значением, не так ли?

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.