<?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-разметки несут в себе одинаковую информацию, но структурированы по-разному, в первом случае наши данные хранятся в атрибуте, а во втором непосредственно в узле. Для того, чтобы определить какой из случаев предпочтительнее, необходимо знать, какими ограничениями обладает каждый из случаев:
- Узел не может содержать несколько атрибутов, с одинаковыми именами.
- Узел можно легко расширить, добавив в него дочерние элементы (узлы или атрибуты).
- Узлы упорядочены между собой, атрибуты нет.
- Узлы могут хранить секцию CDATA, атрибутам приходиться хранить экранированные значения.
- Узлы позволяют описать структуру данных, атрибуты могут содержать только плоские данные.
- Атрибуты имеют более компактную форму записи.
- Атрибуты имеют значения по-умолчанию.
Хорошей практикой считается хранить в атрибутах метаданные (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>
Ссылки:
- Use of Elements vs. Attributes
- Principles of XML design: When to use elements versus attributes
- XML attribute vs XML element
- XML Attributes or Element Nodes?
Лично мне больше нравится "универсальный" вариант, который используется, например в XAML.
ОтветитьУдалитьВ 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 свойства часто могут быть заданы как атрибуты. Синтаксис атрибутов — это наиболее рациональный синтаксис задания свойств, интуитивно понятный разработчикам, использовавшим языки разметки ранее..."