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

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

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

13 60

13 ответов:

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

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

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

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

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

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

сравнить

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

против

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

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

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

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

еще один образом:

  • начните думать о все ваши данные как атрибут.
  • логически группировать атрибуты в элементы. Если вы знаете свои данные, вам редко нужно будет конвертировать атрибут в элемент. Вероятно, вы уже знаете, когда элемент (сбор или повторные данные) необходим
  • группировать элементы вместе логически
  • когда вы запускаете в дело, вам нужно развернуть, добавить новые элементы / атрибуты на основе логического структурируйте процесс выше. Добавление новой коллекции дочерних элементов не будет "ломать" ваш дизайн, и будет легче читать с течением времени.
    <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>

Вы можете возразить, что книга может иметь несколько авторов. Хорошо, просто разверните, добавив новые элементы автора (при необходимости удалите оригинал @автор.) Конечно, вы нарушили первоначальную структуру, но на практике это довольно редко, и легко обойти. Любой потребитель вашего исходного 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>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

attribute="1 2 3 7 20"

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

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

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

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

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

базы данных называются по их атрибуту 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>

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

Это зависит от вас.

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

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

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

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

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

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

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

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