В чем разница между данными XML и метаданными XML? - PullRequest
4 голосов
/ 17 ноября 2010

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

На нескольких сайтах написано: «Данные идут в виде элементов, метаданные - в атрибутах».

Итак, в чем разница между этими двумя?

Давайте возьмем пример из W3Schools :

<note date="12/11/2002">
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

Должна ли дата оставаться атрибутом элемента заметки? Или имеет больше смысла входить в свой собственный элемент?

<date>12/11/2002</date>

Или имеет ли смысл разделять его на несколько элементов?

<date>
  <day>12</day>
  <month>11</month>
  <year>2002</year>
</date>

Ответы [ 3 ]

2 голосов
/ 17 ноября 2010

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

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

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

2 голосов
/ 17 ноября 2010

После «Данные идут в элементах, метаданные в атрибутах.», Я бы сделал Date дочерним элементом.Вам не нужно разбивать его на день, месяц и год, потому что я думаю, что на самом деле есть способ указать в XSD, что элемент должен иметь тип Date.Я думаю, что примером "метаданных" здесь будет поле noteID или, может быть, noteType.Пример:

<note id="NID0001234" type="reminder">
  <date>2002-11-12</date>
  <to>Tove</to>
  <from>Jani</from>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>

ОБНОВЛЕНИЕ: Как отмечали многие другие, это может быть довольно субъективно.Я пытаюсь разделить их по тому, как они будут использоваться.Данные обычно будут представлены пользователю, метаданные будут контролировать представление и могут использоваться для других целей.Но всегда есть исключения ...

1 голос
/ 17 ноября 2010

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

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

Теперь, что касается предложенного вами образца:

<note date="12/11/2002">  
  <to>Tove</to>  
  <from>Jani</from>  
  <heading>Reminder</heading>  
  <body>Don't forget me this weekend! Remember what happenned last time you forgot!!!</body>  
</note>  

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

Лучше, если все элементы были атрибутами или все были элементами.Единственное исключение: длинный элемент body, вероятно, всегда должен быть элементом.Мне кажется, что это правильно:

<note date="12/11/2002" to="Tove" from="Jani" heading="Reminder">
  <body>Don't forget me this weekend! Remember what happenned last time you forgot!!!</body>  
</note>  

Помещение тела в атрибут ухудшает читабельность, поэтому рекомендуется помещать тело в элемент.

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

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

Что касается вашего вопроса, касающегося месяца / дня / года даты, то да, учтите это, если вам нужен легкий доступ к этим отдельным данным в инструментах, которые обрабатывают XML.Проще найти все заметки до 2009 года с помощью оператора xpath, который не должен выполнять разбор строк, а затем преобразование строк в числа, если вы понимаете, о чем я.С другой стороны, если использование XML не требует от вас выбора или поиска этих отдельных данных (месяц, день, год), сохраняйте их в удобочитаемой форме, как в оригинале.


tl; dr: Существует несколько жестких правил.Пока вы используете элементы и атрибуты согласованно, другим разработчикам и инструментам будет легко их понять и использовать.

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