Должен ли я использовать элементы или атрибуты в XML?

Я изучаю атрибуты XML от W3Schools.

Автор отмечает следующее (выделено мной):

XML-элементы и атрибуты

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

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

В первом примере пол - это атрибут. В последнем случае секс - это элемент. Оба примера предоставляют одинаковую информацию.

Нет никаких правил о том, когда использовать атрибуты и когда использовать элементы. Атрибуты удобны в HTML. В XML я советую избегать их. Вместо этого используйте элементы.

Избегайте атрибутов XML?

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

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

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

Так является ли точка зрения автора известной или это лучшая практика в XML?

Следует ли избегать атрибутов в XML?

W3Schools также упомянул следующее (выделено мной):

Атрибуты XML для метаданных

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

<messages>
  <note id="501">
    <to>Tove</to>
    <from>Jani</from>
    <heading>Reminder</heading>
    <body>Don't forget me this weekend!</body>
  </note>
  <note id="502">
    <to>Jani</to>
    <from>Tove</from>
    <heading>Re: Reminder</heading>
    <body>I will not</body>
  </note>
</messages>

Идентификатор выше - это просто идентификатор, позволяющий идентифицировать различные заметки. Это не часть самой заметки.

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


person Ibn Saeed    schedule 08.07.2009    source источник


Ответы (13)


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

Например, если определенный объект является ЧАСТЬЮ данных, рекомендуется сделать его элементом. Например, имя сотрудника является важной частью данных сотрудника.

Теперь, если вы хотите передать МЕТАДАННЫЕ о данных (что-то, что предоставляет дополнительную информацию о данных), но на самом деле не является частью данных, то лучше сделать это атрибутом. Например, допустим, что у каждого сотрудника есть GUID, необходимый для внутренней обработки, тогда лучше сделать его атрибутом. (GUID - это не то, что передает действительно полезную информацию кому-то, кто просматривает xml, но может быть необходимо для других целей)

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

Необязательно ИЗБЕГАТЬ атрибутов любой ценой. Иногда их легче моделировать, чем элементы. Это действительно зависит от данных, которые вы пытаетесь представить.

person Prashanth    schedule 08.07.2009
comment
Атрибуты предназначены не только для метаданных - они используются для любых данных, которые не являются иерархическими. См. Ответ Уильяма Уолсета. - person Bip901; 30.04.2021

Мои 0,02 через пять лет после ОП - полная противоположность. Позволь мне объяснить.

  1. Используйте элементы, когда вы группируете похожие данные, и атрибуты этих данных.
  2. Не используйте элементы для всего.
  3. Если данные повторяются (от 1 до многих), вероятно, это элемент
  4. Если данные никогда не повторяются и имеют смысл только при сопоставлении с чем-то еще, это атрибут.
  5. Если у данных нет других атрибутов (например, имени), то это атрибут
  6. Группируйте похожие элементы вместе для поддержки синтаксического анализа коллекции (например, / xml / character)
  7. Повторно используйте похожие имена элементов для поддержки анализа данных
  8. Никогда, никогда не используйте числа в названиях элементов для отображения позиции. (т.е. character1, character2) Эта практика очень усложняет синтаксический анализ (см. # 6, синтаксический анализ кода должен / character1, / character2 и т. д., а не просто / character.

Считается по-другому:

  • Начните с рассмотрения всех ваших данных как атрибута.
  • Логически сгруппируйте атрибуты в элементы. Если вы знаете свои данные, вам редко понадобится преобразовывать атрибут в элемент. Вы, вероятно, уже знаете, когда необходим элемент (коллекция или повторяющиеся данные)
  • Логически группируйте элементы вместе
  • Когда вы столкнетесь с делом, которое вам нужно расширить, добавьте новые элементы / атрибуты на основе логической структуры процесса, описанного выше. Добавление новой коллекции дочерних элементов не «сломает» ваш дизайн, и со временем будет легче читать.

Например, если посмотреть на простую коллекцию книг и главных персонажей, в названии никогда не будет «детей», это простой элемент. У каждого персонажа есть имя и возраст.

    <book title='Hitchhiker&apos;s Guide to the Galaxy' author='Douglas Adams'>
        <character name='Zaphod Beeblebrox' age='100'/>
        <character name='Arthur Dent' age='42'/>
        <character name='Ford Prefect' age='182'/>
    </book>

    <book title='On the Road' author='Jack Kerouac'>
        <character name='Dean Moriarty' age='30'/>
        <character name='Old Bull Lee' age='42'/>
        <character name='Sal Paradise' age='42'/>
    </book>

Вы можете возразить, что у книги может быть несколько авторов. Хорошо, просто расширьте, добавив новые элементы автора (при желании удалите исходный @author). Конечно, вы нарушили исходную структуру, но на практике это довольно редко, и ее легко обойти. Любой потребитель вашего исходного XML, который предполагал, что один автор, в любом случае должен будет измениться (они, вероятно, изменят свою БД, чтобы переместить автора из столбца в таблице «книга» в таблицу «автор»).

<book title='Hitchhiker&apos;s Guide to the Galaxy'>
    <author name='Douglas Adams'/>
    <author name='Some Other Guy'/>
    <character name='Zaphod Beeblebrox' age='100'/>
    <character name='Arthur Dent' age='42'>
    <character name='Ford Prefect' age='182'/>
</book>
person William Walseth    schedule 10.09.2014
comment
2 других классики, которых следует избегать. 1) НИКОГДА не называйте имя элемента ‹attribute›. 2) Избегайте следующего. ‹Attribute name = 'Name' value = 'Douglas Adams' /›, используйте ‹author name = 'Douglas Adams' /›. Блин. - person William Walseth; 05.11.2020

Не менее важно то, что размещение вещей в атрибутах делает XML менее подробным.

Сравнивать

<person name="John" age="23" sex="m"/>

Против

<person>
    <name>
        John
    </name>
    <age>
        <years>
            23
        </years>
    </age>
    <sex>
        m
    </sex>
</person>

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

person flybywire    schedule 08.07.2009
comment
но отсутствие атрибутов делает его более сложным, если не многословным. - person Ibn Saeed; 08.07.2009
comment
@ Ибн Саид, я не думаю, что это сложнее. Так же легко получить атрибут из XML или элемента. - person Nathan Koop; 08.07.2009
comment
Я согласен, особенно с очень большими документами, из-за большого количества пробелов их очень трудно читать. - person William Walseth; 10.09.2014
comment
Что, если вам нужно включить пятерых детей Джона и их возраст? - person dbasnett; 03.01.2016
comment
@dbasnett, затем вы создаете дочерний элемент для каждого дочернего элемента под одним элементом ‹person›. Эти два понятия не исключают друг друга. Если вы думаете об элементе как об «объекте», а об атрибутах как о «точках данных» в этом объекте, тогда легко решить, когда использовать каждый из них. - person gbjbaanb; 08.06.2016

Я использовал Google для поиска точного вопроса. Сначала я прочитал эту статью, http://www.ibm.com/developerworks/library/x-eleatt/index.html. Хотя для простого вопроса как такового это показалось слишком длинным. Во всяком случае, я прочитал все ответы по этой теме и не нашел удовлетворительного резюме. Поэтому я вернулся к последней статье. Вот краткое изложение:

Когда я использую элементы и когда я использую атрибуты для представления фрагментов информации?

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

Принцип основного содержания

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

Принцип структурирования информации

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

Принцип удобочитаемости

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

Принцип привязки элемента / атрибута

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

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

person Gajus    schedule 27.04.2013
comment
Использование информации, представленной в ссылке, избавило меня от многих головных болей. Да, он создает более подробный XML, но оно того стоит. Следуйте этим принципам, и вы вряд ли ошибетесь. - person dbasnett; 08.06.2016

Отображение модели атрибутов. Набор атрибутов элемента изоморфизируется непосредственно в карту имя / значение, в которой значениями являются текст или любой сериализуемый тип значения. В C #, например, любой объект Dictionary<string, string> может быть представлен в виде списка атрибутов XML, и наоборот.

Это категорически не относится к элементам. Хотя вы всегда можете преобразовать карту имя / значение в набор элементов, обратное не так, например:

<map>
   <key1>value</key1>
   <key1>another value</key1>
   <key2>a third value</key2>
</map>

Если вы преобразуете это в карту, вы потеряете две вещи: несколько значений, связанных с key1, и тот факт, что key1 появляется перед key2.

Значение этого становится намного яснее, если вы посмотрите на код DOM, который используется для обновления информации в таком формате. Например, легко написать так:

foreach (string key in map.Keys)
{
   mapElement.SetAttribute(key, map[key]);
}

Этот код краткий и недвусмысленный. Сравните это, скажем, с:

foreach (string key in map.Keys)
{
   keyElement = mapElement.SelectSingleNode(key);
   if (keyElement == null)
   {
      keyElement = mapElement.OwnerDocument.CreateElement(key);
      mapElement.AppendChild(keyElement);
   }
   keyElement.InnerText = value;
}
person Robert Rossney    schedule 08.07.2009

Вы не можете поместить CDATA в атрибут. По моему опыту, рано или поздно вы захотите поместить одинарные кавычки, двойные кавычки и / или целые XML-документы в «член», и если это атрибут, вы будете ругать человека, который вместо этого использовал атрибуты. элементов.

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

person Coxy    schedule 09.07.2009
comment
Если вы строите с помощью DOM, использование одинарных и двойных кавычек не является проблемой для атрибутов. Если вы строите XML в виде строки, тогда у вас может возникнуть масса других проблем. - person William Walseth; 10.09.2014

Это пример, где атрибуты - это данные о данных.

Базы данных именуются по их атрибуту ID.

Атрибут «тип» базы данных обозначает, что ожидается внутри тега базы данных.

  <databases>

      <database id='human_resources' type='mysql'>
        <host>localhost</host>
        <user>usrhr</user>
        <pass>jobby</pass>
        <name>consol_hr</name>
      </database>

      <database id='products' type='my_bespoke'>
        <filename>/home/anthony/products.adb</filename>
      </database>

  </databases>
person Anthony Scaife    schedule 01.04.2014

Все зависит от того, для чего используется XML. Когда это в основном взаимодействие между программным обеспечением и машинами - например, веб-сервисы, проще перейти на все элементы, хотя бы ради согласованности (а также некоторые фреймворки предпочитают это таким образом, например, WCF). Если он предназначен для потребления людьми, т.е. в первую очередь создается и / или читается людьми, то разумное использование атрибутов может значительно улучшить читаемость; XHTML является разумным примером этого, а также XSLT и XML-схема.

person Pavel Minaev    schedule 08.07.2009

Обычно я работаю на основе того, что атрибуты являются метаданными, то есть данными о данных. Я стараюсь не помещать списки в атрибуты. например

attribute="1 2 3 7 20"

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

Один из сценариев, в котором вы можете захотеть кодировать с предпочтением атрибутов, - это скорость обработки с помощью синтаксического анализатора SAX. Используя синтаксический анализатор SAX, вы получите обратный вызов элемента, содержащий имя элемента и список атрибутов. Если вместо этого вы использовали несколько элементов, вы получите несколько обратных вызовов (по одному для каждого элемента). Насколько это обременительно / требует времени, конечно, обсуждается, но, возможно, стоит подумать.

person Brian Agnew    schedule 08.07.2009
comment
Стандартный способ создания списков в атрибутах - attribute = 1 2 3 7 20, который поддерживается схемой XML. - person John Saunders; 08.07.2009
comment
т.е. пробелы разделены? Я этого не знал. Теперь могу ли я извлечь их с помощью (скажем) XPath и других стандартных инструментов? - person Brian Agnew; 08.07.2009

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

Тебе решать.

person John Saunders    schedule 08.07.2009
comment
Я бы использовал XML с PHP и MySQL. В основном, на основании создания диаграмм или передачи данных в настольное приложение для манипуляций. - person Ibn Saeed; 08.07.2009

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

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

person NickFitz    schedule 08.07.2009

При выборе формата XML следует иметь в виду еще одну вещь: если я правильно помню, значения атрибутов «id» не должны быть полностью числовыми, они должны соответствовать правилам для имен в XML. И, конечно же, значения должны быть уникальными. У меня есть проект, который должен обрабатывать файлы, которые не соответствуют этим требованиям (хотя в остальном они являются чистым XML), что сделало обработку файлов более запутанной.

person Grimarr    schedule 09.07.2009

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

Если данные более тесно связаны с элементом, это будет атрибут.

то есть: идентификатор элемента, я бы поместил его как атрибут элемента.

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

Все зависит от вас и от того, как вы создаете свою схему.

person HyLian    schedule 08.07.2009