Feel Good.

27 мая 2010

XML elements или XML attributes

Всегда проектируя структуру XML файла, Вы наверняка задумывались, где хранить данные: в атрибуте (XML attribute) или все-таки в узле (XML element). Это довольно важный вопрос, который нужно решить раз и навсегда еще на этапе проектирования XSD схемы, иначе последующее переделывание XSD схемы не есть хорошая практика. Обратите внимание на два XML файла:

<?xml version="1.0" encoding="utf-8" ?>

<!-- Храним данные в атрибуте -->

<root>

    <child data="some data"></child>   

</root>

 

 

<?xml version="1.0" encoding="utf-8" ?>

<!-- Храним данные в узле -->

<root>

    <child>

        <data>

            some data

        </data>

    </child>

</root>



Приведенные выше две XML-разметки несут в себе одинаковую информацию, но структурированы по-разному, в первом случае наши данные хранятся в атрибуте, а во втором непосредственно в узле. Для того, чтобы определить какой из случаев предпочтительнее, необходимо знать, какими ограничениями обладает каждый из случаев:
  1. Узел не может содержать несколько атрибутов, с одинаковыми именами.
  2. Узел можно легко расширить, добавив в него дочерние элементы (узлы или атрибуты).
  3. Узлы упорядочены между собой, атрибуты нет.
  4. Узлы могут хранить секцию CDATA, атрибутам приходиться хранить экранированные значения.
  5. Узлы позволяют описать структуру данных, атрибуты могут содержать только плоские данные.
  6. Атрибуты имеют более компактную форму записи.
  7. Атрибуты имеют значения по-умолчанию.

Хорошей практикой считается хранить в атрибутах метаданные (metadata), а в узлах сами данные (!)

Резюмируя, можно сказать, что ID, Name, Date, Money и подобное лучше хранить а атрибутах, большие тексты, данные (нуждающиеся в экранировании), списки, тем более данные, которые можно представить в виде структуры, храните в узлах.


<!-- Неудачный вариант разметки.

body - может содержать спец. символы,

быть достаточно длинным полем, и нет

гарантий, что оно в дальнейшем не

расширится дочерними узлами.

-->

<message id="123" body="Hello world" />

 

<!-- Универсальный вариант, храним все в узлах.

Много текста и выглядит немного громоздко.

-->

<message>

    <id>123</id>

    <body>Hello world</body>

</message>

 

<!-- Оптимальный вариант. -->

<message id="123">

    Hello world

</message>




Ссылки:
  1. Use of Elements vs. Attributes
  2. Principles of XML design: When to use elements versus attributes
  3. XML attribute vs XML element
  4. XML Attributes or Element Nodes?

Progg it

2 комментария:

  1. Лично мне больше нравится "универсальный" вариант, который используется, например в XAML.

    ОтветитьУдалить
  2. В XAML свойство, Content у Button (Content="This is a button") записывать в виде:
    <Button>
      <Button.Content>
        This is a button
      </Button.Content>
    </Button>

    Да, но в тоже время мы ведь можем немного рационализировать разметку:
    http://msdn.microsoft.com/ru-ru/library/ms752059%28VS.90%29.aspx#properties

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

    ОтветитьУдалить