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

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

Я никогда не мог понять, когда использовать атрибуты xml. я всегда использовать элементы. Я просто прочитал эту статью w3schools. В статье говорится, что использовать атрибуты неправильно, потому что:

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

Единственное исключение, которое он указывает, - это когда вы назначаете идентификатор тегу.

Это правильно? Почему атрибуты существуют тогда? Это была ошибка дизайна с xml? Что-то мне здесь не хватает?

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

<date> May 23, 2001 </date>

в

<date>
   <month> May </month>
   <d> 23 </d>
   <yr> 2001 </yr>
</date>

Потому что это невозможно с атрибутом.

Бонусный вопрос. В примере с датой можно было бы сделать что-то вроде этого:

<date>
   <default> May 23, 200 </default>
   <month> May </month>
   <d> 23 </d>
   <yr> 2001 </yr>
</date>

Придать будущим приложениям больше (или другую) информацию, все еще предлагая существующим приложениям тот же формат? Или вы должны это сделать:

<date> May 23, 2001 </date>
<NEWdate>
   <month> May </month>
   <d> 23 </d>
   <yr> 2001 </yr>
</NEWdate>

Ответ 1

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

<speed unit="mph">65</speed>

Ответ 2

Точки, которые вы перечисляете о элементах, верны, и я бы добавил следующее:

  • элементы обычно делают более красивыми (более читаемыми) diff, когда вам нужно сравнивать версии файла.

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

Рассмотрим этот пример (базовая гиперссылка):

<a href="http://www.htmlhelp.com/" title="Help Information" target="_top">Web Design Group</a>

Хотелось бы это, если бы вам пришлось писать или читать это так?

<a>
    <href>http://www.htmlhelp.com/</href>
    <title>Help Information</title>
    <target>_top</target>
    <text>Web Design Group</text>
</a>

Мне кажется, что много шума.

Ответ 3

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

<date month="12" day="31" year="2009"/>

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

Ответ 4

Подумайте о блоке контактной информации...

<!-- attribute version -->
<person name="Matt" age="27">
    <phone type="mobile" value="1234567890" />
    <phone type="work" value="1234560987" />
    <address type="home" 
             city="NoWhere" 
             state="OH" 
             street="123 Lost Ave." 
             zipcode="12345" />
</person>

<!-- element version -->
<person>
    <name>Matt</name>
    <age>27</age>
    <phone>
        <type>mobile</type>
        <value>1234567890</value>
    </phone>
    <phone>
        <type>work</type>
        <value>1234560987</value>
    </phone>
    <address>
        <type>home</type> 
        <city>NoWhere</city>
        <state>OH</state>
        <street>123 Lost Ave.</street>
        <zipcode>12345</zipcode>
    </address>
</person>

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

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

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

Ответ 5

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

Я предпочитаю использовать атрибуты для метаданных о соответствующем элементе. Например, мне нравится указывать даты как <date format="dd-MMM-yyyy">20-Jan-2010</date>. Если у вас есть однозначные элементы данных, продолжайте и просто создавайте атрибуты. <name first="Tom" last="Jones"/> работает во многих случаях.

Ответ 6

Все те пункты из статьи w3schools абсолютно верны и правильны. Я согласен - я редко использую атрибуты в своих XML-документах.

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

<Customer Id="123123">
 ....
</Customer>

Но даже здесь он подбрасывает. Вы можете так же легко поместить этот идентификатор в элемент <ID>123123</ID>.

Кроме того, в моем случае, поскольку WCF DataContractSerializer не поддерживает XML-атрибуты (по соображениям производительности), это еще одна причина не использовать их (много):

Ответ 7

"Почему атрибуты даже существуют тогда?"

Чтобы обеспечить более сжатый XML-код, просто для сохранения ввода. И, конечно же, любой XML файл, содержащий атрибуты

<element attr1="val1" attr2="val2" ... attrN="valN">
   <nestedElement>
     ...
   </nestedElement>
</element>

можно легко преобразовать в "атрибутный":

<element>
       <attributes>
         <attr1>val1</attr1>
         <attr2>val2</attr2>
         ...
         <attrN>valN</attrN>
       </attributes>
       <nestedElement>
         ...
       </nestedElement>
    </element>

Ответ 8

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

<page size="a4">

чем

<page>
  <size>a4</size>
</page>

Ответ 9

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