
Xml элементы
Элементы XML расширяемы и взаимосвязаны. Элементы XML имеют достаточно простые правила именования. Рассмотрим на примере возможность расширения элементов. Предположим элементы, описывающие исходное сообщение имеют вид:
<note>
<date>2002–08–01</date>
<to>Сергей</to>
<from>Наталья</from>
<body>Не забудь принести конспект!</body>
</note>
Представим, что мы сделали простую программу – вычислитель (parser), которая анализирует XML файл, изымает из него данные, содержащиеся в тегах <to>, <from> и <body> и представляет эту информацию в виде:
Сообщение
Кому: Сергей
От кого: Наталья
Не забудь принести конспект!
А теперь давайте представим, что автор XML документа добавил в него некоторую уточняющую информацию:
<note>
<to>Сергей</to>
<from>Наталья</from>
<heading>Напоминание</heading>
<body>Не забудь принести конспект!</body>
</note>
Стоит вопрос, что тогда произойдет с программой и нужно ли ее переписывать?
Правильно написанную программу переписывать не потребуется. При анализе XML файла программа будет искать содержимое тегов <to>, <from>, и <body> и она, по прежнему, будет выводить на экран такое же напоминание.
В этом и есть суть того, что называется расширяемостью языка XML.
Рассмотрим взаимосвязанность XML элементов. XML элементы имеют родственные наследственные связи. Для понимания XML терминологии необходимо знать, как называются отношения между XML элементами, и как описывается содержание XML элементов. Например, предположим, что у нас есть описание книги:
Xml с нуля
Введение в XML
Что такое HTML
Что такое XML
Синтакс XML
Элементы должны иметь закрывающий тег
Элементы должны быть строго вложенными
Представим, что XML документ описывает эту книгу:
<book>
<title>XML с нуля</title>
<prod id="33–657" media="paper"></prod>
<chapter>Введение в XML
<para>Что такое HTML</para>
<para>Что такое XML</para>
</chapter>
<chapter>Синтакс XML
<para>Элементы должны иметь закрывающий тег</para>
<para>Элементы должны быть строго вложенными</para>
</chapter>
</book>
Book (книга) - это корневой элемент. Элементы Title, prod, и chapter являются потомками элемента book. Book является родительским элементом для элементов title, prod и chapter. Элементы Title, prod, и chapter представляют родственные (сестринские элементы), поскольку у них имеется общий родитель book.
Cодержимое XML элементов
Содержимое элементов имеет несколько типов. Элемент может иметь:
элементное содержимое;
смешанное содержимое;
простое содержимое;
пустое содержимое.
У элемента также могут быть атрибуты.
В ранее рассмотренном примере book имеет элементное содержимое, потому что содержит другие элементы. Элемент Chapter имеет смешанное содержимое, поскольку содержит как текст, так и другие элементы, а элемент Para имеет простое содержимое, поскольку в нем содержится только текст. Элемент Prod имеет пустое содержимое, поскольку внутри тегов его конструкции ничего нет.
Обратите внимание на тот факт, что у элемента prod есть атрибуты. Атрибут id (индекс) и имеет значение 33–657, а атрибут media имеет значение paper.
Именование элементов
XML элементы должны именоваться в соответствии со следующими правилами:
Имена могут состоять из букв цифр и других символов;
Имена не могут начинаться с цифры или знака препинания;
Имена не должны начинаться с последовательности символов: xml (или XML, или Xml и т. д.);
Имена не могут содержать пробелов.
При присвоении собственных имен элементам необходимо придерживаться следующих правил:
Для имен нет ограничений, и у пользователя полная свобода в выборе имен, но важно, чтобы ваши имена элементов было читабельны (понимаемы).
Имена с символом подчеркивания в качестве разделителя являются хорошим стилем определения имен, например: <first_name>, <last_name>.
Рекомендуется избегать использования символов «-» и «.» в именах. Например, если элементу было присвоено имя first-name, то вполне вероятна ошибка, что некоторые программы попытаются от first вычесть name. В случае если пользователь назвал элемент first.name, некоторые программы могут воспринять это имя как параметр name элемента first.
В XML спецификации длина имени не ограничена, но этим не следует злоупотреблять. Имена должны быть короткими и простыми, такими как <book_title>, а не <the_title_of_the_book>.
XML документы часто привязаны к какой-либо существующей базе данных, в которой структурные объекты соответствуют элементам XML документа. Хорошим тоном считается присваивать имена XML элементам в соответствии с именами, существующими в базе данных.
В спецификации XML разрешается использовать кириллицу для имен элементов, но лучше избегать этого, поскольку большинство программ может неправильно обрабатывать документы, имена в которых описаны не английским алфавитом.
В именах нельзя использовать символ «:», поскольку он зарезервирован для пространств имен.
Атрибуты XML
Атрибуты предназначены для указания дополнительной информации об элементе.
Атрибуты часто предоставляют информацию, которая не является частью данных. В приведенном ниже примере, значение типа файла не имеет никакого отношения к данным, но значение атрибута будет необходимым для программы, которая осуществляет обработку этого элемента.
<file type="gif">computer.gif</file>
Значения атрибутов должны быть заключены в кавычки, причем вы можете для этой цели использовать как одинарные, так и двойные кавычки. Указать год рождения человека можно так:
<person year="1960"> или: <person year='1960'>
Следует отметить важный факт, что если в значении атрибута есть двойные кавычки, то это значение должно быть записано внутри одинарных кавычек, а если в значении атрибута есть одинарные кавычки, то это значение должно быть записано внутри двойных кавычек:
<gangster name='George "Shotgun" Ziegler'>
<gangster name="George 'Shotgun' Ziegler">
Стоит не мало важный вопрос, как лучше описывать и хранить данные, как значения атрибутов, либо как дочерние элементы. В XML нет строгих правил, где следует использовать атрибут, а где — дочерний элемент. Тем не менее, правило можно сформулировать самостоятельно:
Для хранения информации, которая описывает данные, следует использовать дочерний элемент, служебную информацию следует описывать значениями атрибутов.
Этот факт объясняется типизацией данных в случае преобразования XML документа в XML пакет, с целью использования пакета для обмена данными между базами данных.
Рассмотрим пример, в котором дата записки определена как атрибут:
<note date="12/11/2002">
<to>Сергей</to>
<from>Наталья</from>
<heading>Напоминание</heading>
<body> Не забудь принести конспект!</body>
</note>
Описать дату записки лучше как отдельный элемент, например:
<note>
<date>12/11/2002</date>
<to>Сергей</to>
<from>Наталья</from>
<heading>Напоминание</heading>
<body> Не забудь принести конспект!</body>
</note>
Если необходимо, то дату записки можно описать в расширенном (более гибком) элементе:
<note>
<date>
<day>12</day>
<month>11</month>
<year>2002</year>
</date>
<to>Сергей</to>
<from>Наталья</from>
<heading>Напоминание</heading>
<body>Не забудь принести конспект!</body>
</note>
Стоит вопрос, следует ли вообще избегать использования атрибутов, так как с использованием атрибутов связаны достаточно серьезные проблемы:
атрибуты не могут содержать больше одного значения, а дочерние элементы могут;
атрибуты трудно расширяются в случае необходимости внесения каких-либо изменений;
структуры нельзя описать атрибутами, а дочерними элементами можно;
программы – parser'ы трудно реализуются для работы с атрибутами, так как атрибуты сложно проконтролировать на соответствие единому DTD (определению типа документа), устанавливающему валидность (правильность) того или иного XML документа.
Таким образом, можно сделать вывод:
Если вы используете атрибуты для хранения данных, то учтите, что ваши документы сложны для чтения и записи. Старайтесь использовать элементы для хранения данных. Атрибуты используйте, только чтобы указать информацию, не имеющую отношение к данным.
Однако у правил всегда есть исключения. Рассмотрим случай, который демонстрирует обоснованное применение атрибутов. Иногда пользователь назначает идентификаторы (id) элементам. Эти идентификаторы используются для доступа к определенным XML элементам, подобно тому, как это делается в HTML, например:
<messages>
<note id="p501">
<to>Сергей</to>
<from>Наталья</from>
<heading>Напоминание</heading>
<body>Не забудь принести конспект!</body>
</note>
<note id="p502">
<to>Наталья</to>
<from>Сергей</from>
<heading>Re: Напоминание</heading>
<body>Не забуду!</body>
</note>
</messages>
В данном примере идентификатор играет всего лишь роль счетчика и позволяет ориентироваться среди различных записок в XML файле. Следует заметить, что идентификаторы не являются частью данных.
Повторно отметим, что метаданные (данные о данных) должны храниться в атрибутах, в то время как сами данные должны храниться в элементах.