it-swarm.com.ru

Должен ли я использовать элементы или атрибуты в 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 для метаданных

Иногда идентификаторы ссылок присваиваются элементам. Эти идентификаторы могут использоваться для идентификации элементов 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>

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

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

62
Ibn Saeed

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

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

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

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

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

53
Prashanth

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

Сравнить

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

Против

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

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

19
flybywire

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

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

Рассмотрим другой способ:

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

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

    <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' в таблицу 'author').

<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>
18
William Walseth

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

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

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

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

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

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

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

Принцип читабельности

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

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

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

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

10
Gajus

Атрибуты модели отображения. Набор атрибутов элемента изоморфизируется непосредственно в карту имя/значение, в которой значения являются текстовыми или любыми сериализуемыми типами значений. Например, в 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;
}
5
Robert Rossney

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

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

3
Coxy

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

3
Pavel Minaev

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

attribute="1 2 3 7 20"

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

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

3
Brian Agnew

Это пример, где атрибуты являются данными о данных.

Базы данных именуются по их атрибуту 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>
2
Anthony Scaife

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

Тебе решать.

2
John Saunders

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

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

0
NickFitz

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

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

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

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

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

0
HyLian

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

0
Grimarr