Элементы XML-документа
XML - файл состоит из текста и разметки. Текст размещается в элементе , который начинается и заканчивается тегами.
Элемент имеет имя (это тип элемента ), заключённое в угловые скобки <>, которое определяет начальный и конечный тэг (дискриптор). Имена (типы элементов) чувствительны к регистру символа. Имя элемента может начинаться с буквы, знака подчёркивания (_) или двоеточия (:) и не могут начинаться с буквосочетания “xml”.
Конечный тэг (дискриптор) дополнительно имеет косую черту.
Элемент может содержать один тэг (дискриптор) с пробелом и замыкающей косой чертой в конце:
Элемент, состоящий из одного тэга (дискриптора) называется пустым элементом , а из двух тэгов и содержащий в себе любые данные – непустым.
Угловая скобка в начале дискриптора (<) в языках разметки называется MDO (Markup Declaration Open – открытие декларации разметки), а в конце дискриптора (>) - называется MDC (Markup Declaration Close – закрытие декларации разметки).
Хорошо оформленный XML документ обязательно должен иметь корневой элемент (root element ). Внутри корневого элемента кроме текста могут находиться вложенные элементы :
В XML - файле должен присутствовать только один корневой элемент. В примере это
Вложенные элементы называются дочерними элементами, а элементы, которые их окружают – родительскими элементами.
Такое требование возникло потому, что один документ XML можно вложить в другой. При этом корневой элемент вложенного документа станет просто одним из элементов документа, в который он вложен. Такое вложение не нарушит структуру документа.
Начинается XML-файл обычно с объявления , которое ещё называют пролог (prolog ). Пролог состоит из двух частей.
Первая часть пролога включает декларацию XML (XML Declaration ). Декларация заключена между символами ...?>, содержит пометку xml и номер версии спецификации XML. Она может включатьуказания на кодировку символов в которой написан данный текст. В объявление можно поместить еще параметр standalone со значениями "yes" или "no". Значение "no" показывает, что документ использует определения элементов, сделанные в другом, внешнем, документе. По умолчанию принимается значение "yes". Итак, полное объявление XML может выглядеть следующим образом:
Вторая часть пролога - объявление типа документа , DTD (Document Type Declaration ) - может занимать одну или несколько строк. В этой части объявляются теги, использованные в документе, или приводится ссылка на файл, в котором записаны такие объявления. Объявление типа документа начинается с символов . Его содержимое зависит от способа объявления тегов.
Все это вместе выглядит так:
В примере рассматривается первая версия XML и русская кодировка символов для операционных систем Windows. Для операционных систем UNIX русская кодировка – "KOI8-R". Можно использовать универсальную кодировку "UTF-8" для Unicode.
Правила описания элементов XML-файла tutorial находится в каталоге SYSTEM, а не в общем каталоге PUBLIC в файле filename.dtd.
В примере, в соответствии с правилами, имя XML документа tutorial совпадает с именем корневого элемента.
Атрибуты XML-документа
Атрибуты состоят из имени и значения, где значение берется в двойные кавычки ("). Атрибуты позволяют сохранять вместе с элементом дополнительные параметры. Атрибут (или несколько атрибутов) указывается внутри начального тега элемента. При добавлении нескольких атрибутов они разделяются пробелами:
Имена атрибутов могут содержать такие же символы, что и имена элементов, с теми же правилами исключения пробелов и начала имени с буквы.
Значение атрибутов может заключаться как в одинарные (апострафы), так и в двойные кавычки. Кроме того возможно также использование одних кавычек внутри других:
< myElement attribute=""value"">< /myElement>
Если значение атрибута содержит в себе кавычки, то его нужно заключить в апострофы, если значение содержит апострофы, то его заключают в кавычки. Если же кавычки и апострофы уже использованы для ограничения значений атрибутов, то внутри значения кавычку можно заменить ссылкой на сущность " , а апостроф – ссылкой " . Вместо ссылок на сущности можно записать коды кавычки и апострофа– " и " . В шестнадцатеричной форме коды кавычки и апострофа выглядят так: х22; и х27; .
Во время обдумывания разметки документа и создания тегов всегда возникает вопрос о том, куда поместить ту или иную информацию: в содержимое элемента или в его атрибуты? Ответ неоднозначен, он зависит и от самой информации, и от целей ее разметки, а часто это просто дело вкуса.
Атрибуты удобны для описания простых значений. Практически у каждого гражданина России обязательно есть одно имя, одно отчество и одна фамилия. Их удобно записывать атрибутами. Но у гражданина России может быть несколько телефонов, поэтому их номера удобнее оформить как элементы < work-phone> и < home-phone> , вложенные в элемент < phone-list> , а не атрибуты открывающего тега < phone-list> . Заметьте, что элемент < name> с атрибутами пустой, у него нет содержимого, следовательно, не нужен закрывающий тег. Поэтому тег < name> с атрибутами завершается символами "/> ". Пример XML-документа с атрибутами в открывающем теге:
< notebook>
< person>
< />
< birthday> 25.03.1977 birthday>
< address>
< street> Садовая, 23-15 street>
< city> Санкт-Петербург city>
< zip> 123456 zip>
address>
< phone-list>
< work-phone>2654321 work-phone>
< work-phone>2654 023 work-phone>
< home-phone>34567 81 home-phone>
phone-list>
person>
< person>
< name first="Mapия" sесоnd ="Петровна" surname="Сидорова" />
< birthday> 17.05.1969 birthday>
< address>
< street> Малиновская, 17 street>
< city>Пушкин city>
< zip> 234561 zip>
address>
< phone-list>
< home-phone> 2334455 home-phone>
phone-list>
person>
notebook>
В этом примере первые две строки – пролог (декларации, определения).
Элемент < name first="Ивaн" sесоnd="Петрович" surname="Сидоров" /> - пустой и содержит три атрибута.
Элемент < person> повторяется дважды и является родительским для элементов: < name />, < birthday> , < address>, < phone-list>. Некоторые из этих элементов в свою очередь являются родительскими.
Атрибуты открывающего тега удобны и для указания типа элемента. Например, мы не уточняем, в городе живет наш родственник, в поселке или в деревне. Можно ввести в открывающий тег < city> атрибут type, принимающий одно из значений город, поселок, деревня. Например:
< city type="город"> Mocквa city>
Как видите, значения атрибутов можно записывать не только латинскими, но и русскими буквами. Спецификация XML допускает для записи значений атрибутов и содержимого элементов практически все символы Unicode.
Похожая информация.
Элементы и атрибуты в XML Схеме
Помимо богатых возможностей для определения типов данных XML Schema включает богатый словарь для определения структуры документа и разрешенных элементов и атрибутов.
– Простое содержимое. Элемент содержит только текст (хотя, как говорилось в предыдущем параграфе, текст можно ограничить данными отдельного типа, такими как дата или числовое значение). Содержимое этого типа определяется при помощи элемента simpleContent.
– Толькоэлементы. Элемент содержит только вложенные элементы. Содержимое этого типа определяется при помощи элемента complexType.
– Смешанноесодержимое. Элемент может содержать и текстовое содержимое, и вложенные элементы. XML Schema требует, чтобы последовательность элементов и текстового содержимого была строго определена, и допустимые документы должны соответствовать этой последовательности.
– Пустоесодержимое. Элемент содержит только атрибуты, и никакого текстового содержимого. XML Schema интерпретирует такие элементы как особый случай содержимого типа «только элементы» без объявленных элементов.
– Любоесодержимое. Элемент может быть пустым, содержать вложенные элементы и/или текст. Содержимое этого типа определяется при помощи элемента anyТуре.
Эти базовые типы элементов могут задаваться в объявлениях элементов схемы. Кроме того, можно указать, что элемент может встречаться в документе несколько раз, и задать минимальное и максимальное количество вхождений. Подобно SQL, XML Schema поддерживает значение элементов NULL, указывающее, что содержимое элемента неизвестно. В терминологии XML это значение называется nil, но смысл его тот же самый. Поддержка этого значения упрощает перенос данных между XML и столбцами баз данных, которые могут содержать значения NULL.
Схема XML позволяет определить логическую группу элементов, которые, как правило, используются совместно, и задать для этой группы собственное имя. Данную группу можно включать в последующие объявления элементов как единое целое. Группировка элементов делает их структуру еще более гибкой. Группа может определять последовательность элементов, которые должны обязательно присутствовать в документе в заданном порядке. Или же она может определять набор элементов, из которого в документе обязательно должен присутствовать только один элемент.
Аналогичные возможности имеются и для управления атрибутами. Отдельный атрибут можно определить как обязательный или необязательный. Можно задать значение атрибута по умолчанию, которое будет использоваться в том случае, если значение этого атрибута не задано. Можно задать фиксированное значение атрибута, то есть неизменное значение для этого атрибута. Можно определить имя группы атрибутов, которые всегда используются вместе, после этого для определения группы атрибутов для очередного элемента схемы достаточно задать только имя этой группы.
eXtensible Markup Language (XML ) - это язык разметки документов , обеспечивающий текстовый формат хранения данных. Язык XML является подмножеством языка Standard Generalized Markup Language (SGML) и описывает определенный класс объектов, называемых XML-документами.
XML-формат представляет собой платформонезависимый способ структурирования информации путем представления документа в виде дерева элементов, каждый из которых может иметь набор атрибутов, представляющих пару "имя/значение", и содержать другие элементы и/или текст. При этом каждый элемент дерева может ссылаться на другие элементы с помощью своих атрибутов.
Приложения, работающие с XML-документами, для их обработки используют программный компонент - XML-процессор, обеспечивающий доступ к содержимому и структуре XML-документа. В технологии Java XML-процессоры представлены семейством Java for XML Processing (JAXP), включающим в себя процессоры DOM, SAX, StAX и TrAX.
XML-процессоры подразделяются на две категории - потоковые и объектные обработчики. При потоковой обработке XML-документа XML-процессор анализирует документ последовательно, в реальном времени, что экономит ресурсы памяти. SAX - это потоковый XML-процессор. При объектной обработке XML- документа XML-процессор создает в памяти объекты, представляющие состояние документа, что дает возможность в произвольном порядке анализировать его части. DOM - это процессор, поддерживающий объектную модель документа.
Процессор StAX является промежуточным между SAX и DOM, обеспечивая управление анализом XML-документа в приложении.
Процессор TrAX дает возможность трансформации XML-документа в другие форматы данных с использованием таблицы стилей XSLT. Существуют также XML- процессоры, трансформирующие XML-документы в формат HTML и XHTML с использованием каскадных таблиц стилей CSS.
Модель XML-документа описывает его в терминах логической и физической структуры. Логическая структура состоит из объявления, определения типа документа, элементов, комментариев, ссылок и инструкций по обработке документа.
Каждый XML-документ может начинаться с объявления, ограниченного тегами и включающего в себя атрибуты version (версия XML-спецификации - на сегодняшний день только 1.0), encoding (символьная кодировка документа, по умолчанию Unicode) и standalone (по умолчанию no, означает, что документ может иметь свое внешнее описание).
После объявления и определения типа документа его логическая структура представлена набором элементов, комментариев, ссылок и инструкций по обработке документа.
Элементы XML-документа, ограниченные тегами, которые называются разметкой, формируют его иерархическую структуру и могут иметь атрибуты, которые так же, как и элементы, способны хранить данные. XML-документ должен содержать как минимум один корневой элемент.
XML-теги определяют значение, типы данных, а не способ их отображения, как в формате HTML.
Атрибуты элементов представляют собой пары "имя/значение" и могут быть трех типов - строковый тип, лексемы и перечисления.
Дочерний элемент корневого элемента - это такое же его свойство, как и атрибут, за исключением того, что дочерний элемент может иметь свою сложную структуру.
Комментарии ограничиваются тегами и предназначены для документирования XML-документа.
Ссылки ограничиваются амперсандом (&) и точкой с запятой (;) и используются в XML-документах для подстановки при обработке документа вместо них символов или различного рода данных, описанных в определении DTD. Подставляемые данные могут быть обрабатываемыми XML-процессором, т. е. представлены в XML- формате, или необрабатываемыми - текстовые данные не формата XML, изображения и другие двоичные данные. Кроме того, для включения в XML-документ символьных данных, которые не следует обрабатывать XML-процессором, используется секция CDATA, ограниченная тегами .
XML-ссылка - это ссылка на внешний объект, сущность, содержимое которого размещается в текущем месте, т. е. ссылка на сущность работает как подстановка и обеспечивает модульность XML-документа, в отличие от HTML-ссылки, являющейся инструкцией приложению для перехода на другой HTML-документ или фрагмент HTML-документа.
Инструкции по обработке ограничиваются тегами и?> и предназначены для передачи информации приложению, работающему с XML-документом.
Физическая структура XML-документа описывает его как набор сущностей, которые могут быть обрабатываемыми и необрабатываемыми, внешними и внутренними. XML-документ должен содержать как минимум одну сущность - корневую сущность документа. Сущности могут включаться в XML-документ с помощью ссылок.
XML-документы характеризуются условиями корректности (правильности) и действительности. Правильный XML-документ - это документ, имеющий один корневой элемент, элементы которого не перекрываются, удовлетворяющий другим требованиям спецификации XML. Действительный XML-документ - это документ, имеющий описание своей структуры и соответствующий этому описанию.
Помимо базового XML-синтаксиса, основные понятия XML-технологии, используемые в технологии Web-сервисов, - это XML Infoset, XML Schema и XML Namespaces.
XML Namespaces
Для предотвращения конфликта имен в XML-документах используются пространства имен, представляющие собой коллекции имен, в каждой из которых все имена уникальны, при этом каждая такая коллекция имеет свой уникальный идентификатор. Следовательно, каждое XML-имя может характеризоваться идентификатором пространства имен и локальным именем в пределах данного пространства имен.
Идентификатор XML-пространства имен является URI-адресом и используется в определении типа элемента XML-документа (имени начального и конечного тега элемента) и имени атрибута элемента.
Пространство имен объявляется с помощью зарезервированного имени xmlns, после которого может следовать префикс пространства имен, являющийся, по сути, сокращением идентификатора, и далее идет URI-идентификатор пространства имен.
Префикс пространства имен и локальное имя вместе составляют уточненное имя QName элементов и атрибутов XML-документа. Если пространство имен объявлено без префикса, тогда оно становится пространством имен по умолчанию для всех элементов XML-документа, не уточненных префиксом какого-либо пространства имен. Надо заметить, что это не относится к атрибутам XML-документа, которые для связывания с пространством имен всегда необходимо уточнять соответствующим префиксом. Поэтому корректный XML-документ не должен содержать разные по значению атрибуты с одинаковыми, не уточненными префиксом, локальными именами в пределах одного элемента.
Таким образом, механизм XML Namespaces позволяет присваивать уникальные имена элементам и атрибутам XML-документа, предоставляя каждому элементу и атрибуту свое уточненное QName-имя в пределах глобального XML-пространства имен .
XML Infoset
XML-формат делает возможным представление документа в виде иерархической структуры, определяющей его информационное пространство XML Infoset в виде множества информационных единиц, имеющих свойства.
Спецификация XML Information Set (XML Infoset) описывает абстрактную модель данных, представленных XML-документом, в виде набора информационных единиц. Каждая информационная единица является абстрактным описанием определенной части XML-документа и имеет набор связанных с ней свойств.
Необязательно каждый XML-документ должен иметь информационное пространство XML Infoset. Информационное пространство XML Infoset имеют лишь XML- документы, отвечающие правилам XML-синтаксиса согласно спецификации XML и соответствующие пространству имен согласно спецификации XML Namespaces.
Таким образом, правильно оформленный XML-документ - это сериализованная форма определенного информационного пространства.
Модель XML Infoset реализуется различными языками программирования в виде объектов, обеспечивающих доступ к частям XML-документа.
Спецификация XML Infoset определяет для XML-документа 11 типов информационных единиц - каждая с соответствующим набором свойств.
Информационное пространство XML-документа содержит как минимум корневую информационную единицу document . Все остальные информационные единицы информационного пространства XML-документа доступны с помощью свойств корневой информационной единицы document или свойств дочерних для document информационных единиц.
Информационная единица document имеет следующие свойства:
- - список дочерних для document информационных единиц верхнего уровня, при этом список содержит как минимум одну информационную единицу - document element. Список также содержит информационные единицы processing instruction (инструкция по обработке информационной единицы) и comment (комментарий). Список может содержать информационный элемент document type declaration (DTD-описание или ссылка на DTD -описание структуры XML-документа);
- - идентификатор информационной единицы document element;
- - набор информационных единиц notation (нотации, которые дают возможность передавать приложениям различную информацию, например, способ обработки сущности, не подлежащей разбору);
- - набор информационных единиц unparsed entity (сущности, не подлежащие разбору);
- - URI-идентификатор XML-документа;
- - символьная кодировка XML-документа;
- - если YES, тогда указывает автономность документа, т. е. возможность обработки XML-документа без привлечения других документов;
- - версия XML-документа;
- - если true, тогда XML-процессор должен полностью обработать DTD-описание структуры XML-документа.
Каждый XML-документ состоит из элементов, ограниченных тегами и представляющих соответствующие информационные единицы element информационного пространства XML Infoset.
Информационные единицы element являются дочерними по отношению к информационной единице document element и имеют следующие свойства:
- - URI-идентификатор пространства имен, к которому принадлежит элемент;
- - локальная часть имени элемента, которая вместе со свойством образует имя элемента;
- - префикс пространства имен элемента;
- - список дочерних информационных единиц, содержащий информационные единицы element, а также информационные единицы processing instruction (инструкции для обработки), unexpanded entity reference (ссылка на необработанную внешнюю сущность, подлежащую разбору), character (единица текста - последовательности символов) и comment (комментарии) для данного элемента;
- - набор информационных единиц attribute, представленный атрибутами элемента XML-документа;
- - набор информационных единиц attribute, представленный атрибутами элемента, объявляющими используемые элементом пространства имен;
- - набор информационных единиц namespace (пространства имен, используемые элементом);
- - URI-идентификатор элемента;
- - информационная единица, являющаяся родительской.
Атрибуты элементов в виде пар "имя/значение" XML-документа представляют информационные единицы attribute информационного пространства XML Infoset. Атрибуты могут быть определены в XML-документе или установлены по умолчанию.
Атрибуты подразделяются на три типа - строковые, лексемы (знаковый тип) и перечисления.
Информационная единица attribute имеет следующие свойства:
- - URI-идентификатор пространства имен, к которому принадлежит атрибут;
- - локальная часть имени атрибута, которая вместе со свойством образует имя атрибута;
- - префикс пространства имен атрибута;
- - нормализованное значение атрибута с преобразованием пробелов;
- - флаг, указывающий, что атрибут определен в начальном теге элемента или установлен по умолчанию в DTD-описании;
- - тип атрибута, объявленный в описании структуры XML- документа. Возможные значения - ID, IDREF, IDREFS (идентификаторы и ссылки на идентификаторы - знаковые типы), ENTITY, ENTITIES (имена сущностей, не подлежащих разбору - знаковые типы), NMTOKEN, NMTOKENS (лексемы имен - знаковые типы), NOTATION (информация, используемая приложением - строковый тип), CDATA (символьная строка - строковый тип) и ENUMERATION (список допустимых значений атрибута - перечисление);
- - если тип атрибута равен IDREF, IDREFS, ENTITY, ENTITIES или NOTATION, тогда список информационных единиц element, unparsed entity или notation; если тип атрибута - ID, NMTOKEN, NMTOKENS, CDATA или ENUMERATION, тогда свойство не имеет значения;
- - информационная единица element, к которой относится данная единица attribute.
Информационная единица processing instruction , представленная инструкцией обработки элемента в XML-документе, имеет следующие свойства:
- - имя приложения, исполняющего инструкцию;
- - данные для приложения в виде пар "имя/значение";
- - URI-идентификатор инструкции;
- - информационная единица notation, определяющая имя приложения, которое исполняет инструкцию;
- - информационная единица, к которой относится данная инструкция.
Информационная единица unexpanded entity reference представлена ссылкой на необработанную XML-процессором внешнюю сущность, подлежащую разбору. Эта информационная единица имеет следующие свойства:
- - имя сущности;
- - информационная единица element, к которой относится данная сущность.
Информационная единица character представлена символьными данными XML- документа и имеет следующие свойства:
- - символьная кодировка ISO 10646;
- - если true, тогда символ является пробелом;
- - информационная единица element, к которой относится данная информационная единица character.
Информационная единица comment представлена комментариями XML-документа и имеет следующие свойства:
- - строка комментария;
- - информационная единица document или element , к которой относится данный комментарий.
Информационная единица document type declaration представлена ссылкой или самим DTD-описанием структуры XML-документа и имеет следующие свойства:
- - системный идентификатор внешнего DTD-описания в виде URI-адреса;
- - публичный идентификатор общедоступного внешнего DTD-описания в виде URI-адреса;
- - список информационных единиц processing instruction, представленных инструкциями обработки DTD-описания;
- - информационная единица document, к которой относится данное DTD -описание.
Информационная единица unparsed entity представлена сущностью, не подлежащей обработке XML-процессором и объявленной в описании структуры XML- документа. Обычно это ресурс в двоичном формате или другом не XML-формате, например GIF, BMP и др. Информационная единица unparsed entity имеет свойства:
- - имя сущности;
- - системный идентификатор сущности в виде URI-адреса сущности;
- - публичный идентификатор общедоступной сущности в виде URI-адреса сущности;
- - базовый URI-адрес, относительно которого разрешается системный идентификатор;
- - имя нотации, определяющей формат сущности, которая не подлежит обработке;
- - информационная единица notation с именем, указанным в свойстве .
Информационная единица notation представлена нотацией, объявленной в описании структуры XML-документа. Нотации используются для определения формата сущностей (ресурсов), не подлежащих обработке XML-процессором, а также для указания приложений, получающих инструкции по обработке элементов XML- документа. Эта информационная единица имеет следующие свойства:
- - имя нотации;
- - системный идентификатор нотации в виде URI-адреса;
- - публичный идентификатор общедоступной нотации в виде URI-адреса;
- - базовый URI-адрес, относительно которого разрешается системный идентификатор.
Информационная единица namespace представлена пространством имен элемента XML-документа и имеет следующие свойства:
- - часть имени, следующая после xmlns:, если префикс отсутствует, тогда пространство имен является установленным по умолчанию;
- - пространство имен, следующее после префикса.
Как уже было сказано, XML-документы предназначены для хранения данных. Но приложение, использующее XML-документ, работает не непосредственно с документом, а с его информационным пространством XML Infoset, получаемым как результат разбора XML-документа XML-процессором. Однако информационное пространство XML Infoset может быть получено и другими способами, например, с использованием библиотек API DOM. В этом случае такое информационное пространство называется синтетическим .
XML-документы могут быть двух типов - документы, созданные с учетом правил, которым они должны подчиняться, и документы, не имеющие никаких правил.
При использовании XML-документа, не имеющего правил, вся ответственность за корректность написания документа лежит на его авторе.
Однако чаще всего XML-документы имеют описание своей структуры - XML- схему, представляющую собой набор логических и структурных правил. В этом случае проверку документа на соответствие правилам, определенным в описании структуры документа, производит XML-процессор.
XML-процессоры также могут быть двух типов - обработчики, которые обязаны осуществлять проверку XML-документа на соответствие описания его структуры, и обработчики, не осуществляющие такую проверку.
Описание структуры XML-документа, накладывающее ограничения на структуру и содержание документов данного типа, может быть создано с помощью различных языков, таких как Document Type Definition (DTD), XML Schema, RELAX NG и др.
Первым языком для создания XML-схем был язык Document Type Definition (DTD). Язык DTD является компактным и позволяет включать описание структуры XML- документа непосредственно в сам XML-документ. Но синтаксис языка DTD отличается от XML-синтаксиса, поэтому он прямо не поддерживается платформами и инструментами технологии XML. Кроме того, язык DTD не поддерживает пространства имен, а поддержка типов данных ограничена. Язык DTD не позволяет определять элементы, содержащие целые и вещественные числа, даты и времена и др., и не может указывать сложные связи между элементами.
Язык XML Schema дает более богатые возможности по сравнению с DTD и устраняет его недостатки. Синтаксис XML Schema является XML-синтаксисом, кроме того, в языке XML Schema обеспечена поддержка пространств имен и всех необходимых типов данных. Также язык XML Schema позволяет создавать собственные типы данных и расширять существующие. Использование языка XML Schema обеспечивает трансформацию XML-документа в иерархию объектов определенных типов, доступных программным способом с помощью интерфейса (функциональность Post-Schema-Validation Infoset (PSVI)).
Язык RELAX NG, как и XML Schema, использует XML-синтаксис и по сравнению с XML Schema является более простым и легким в изучении. Язык RELAX NG сочетает в себе простоту DTD и богатые возможности XML Schema. Однако так как язык RELAX NG является в определенном смысле упрощением XML Schema, то он не поддерживает функциональность PSVI и имеет упрощенную типовую модель, что делает необходимым использование сторонних библиотек типов данных.
Здесь мы более подробно остановимся на языке XML Schema.
XML Schema
Язык XML Schema (XML Schema Definition (XSD)) позволяет очертить определенный круг XML-документов путем создания описания их структуры, накладывающим ограничения на данный тип документов и обеспечивающим их правильную интерпретацию. Описание XML-документов содержит определения элементов и атрибутов, которые могут появляться в данном типе документов, а также наследование элементов, включая порядок и количество потомков. Кроме того, язык XML Schema определяет тип содержимого элементов, типы данных элементов и атрибутов и, наконец, значения элементов и атрибутов по умолчанию и их фиксированные значения.
XML-документ ссылается на свое описание - XML-схему, созданную с помощью языка XML Schema, используя атрибуты xsi :schemaLocation и xsi :noNamespace- SchemaLocation, где xsi - префикс пространства имен, указанного в XML-документе с помощью атрибута xmlns:
Xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
Атрибут schemaLocation ссылается на XML-схему, имеющую определение пространства имен, а атрибут noNamespaceSchemaLocation - на XML-схему, не указывающую пространство имен для элементов и атрибутов. Атрибуты xsi :schemaLocation и xsi :noNamespaceSchemaLocation ссылаются на XML-схему своими значениями, представленными в виде URI-адреса схемы.
Корневым компонентом XML Schema является элемент
- Необязательный атрибут attributeFormDefault . Значение атрибута " qualified " указывает, что атрибуты XML-документа должны уточняться (квалифицироваться) префиксом их пространства имен. По умолчанию значение атрибута - " unqualified ".
- Необязательный атрибут blockDefault устанавливает по умолчанию значение атрибута block для всех элементов схемы. Возможные значения атрибута:
- #all - в XML-документах запрещена замена базового элемента его производными, созданными любым способом;
- extension - запрещена замена в XML-документах базового элемента производными элементами, полученными путем расширения базового типа элемента;
- restriction - запрещена замена в XML-документах базового элемента производными элементами, полученными путем ограничения базового типа элемента;
- substitution - в XML-документах запрещена любая замена базового элемента.
- Необязательный атрибут elementFormDefault . Значение атрибута " qualified " указывает, что элементы XML-документа должны уточняться (квалифицироваться) префиксом их пространства имен. По умолчанию значение атрибута - " unqualified ".
- Необязательный атрибут finalDefault устанавливает по умолчанию значение атрибута final для всех типов данных схемы. Возможные значения атрибута:
- #all - в XML-схеме запрещено создание производных типов любым способом;
- extension - в XML-схеме запрещено создание производных типов путем расширения базового типа;
- restriction - в XML-схеме запрещено создание производных типов путем ограничения базового типа;
- list - в XML-схеме для простых типов запрещено создание производных типов путем создания списков;
- union - в XML-схеме для простых типов запрещено создание производных типов путем объединения.
- Необязательный атрибут id - идентификатор схемы.
- Необязательный атрибут targetNamespace указывает пространство имен для элементов XML-документа, определяемых данной схемой.
- Необязательный атрибут version - версия схемы.
- Необязательный атрибут xml:lang определяет по умолчанию язык для всех комментариев схемы.
Элемент
схемы. При наличии префикса для данного пространства имен все элементы и типы данных схемы, включая элемент
Элемент
Рис. 1.
Язык XML Schema позволяет создавать описание структуры XML-документов, состоящее из нескольких схем, с помощью элементов
Элемент
Разница между элементами
Элемент
- обязательный атрибут schemaLocation - URI-адрес включаемой схемы.
Элемент
- необязательный атрибут id - идентификатор элемента;
- необязательный атрибут namespace - целевое пространство имен компонентов схемы, на которые можно ссылаться в основной схеме;
- необязательный атрибут schemaLocation - URI-адрес схемы, на компоненты которой можно ссылаться в основной схеме.
С помощью элемента
Элемент
Во все компоненты XML-схемы можно включать документацию с помощью элемента
Элемент
Элемент
XML-схема определяет элементы и атрибуты для XML-документов, используя элементы
Элементы
Элемент
Рис. 1.
- Необязательный атрибут abstract . Если true, тогда этот элемент является абстрактным и сам не может использоваться в XML-документе, а должен замещаться элементами, имеющими в качестве значения атрибута substitutionGroup - имя данного абстрактного элемента. По умолчанию значение атрибута abstract=" false ".
- Необязательный атрибут block ограничивает использование вместо данного элемента элементов с определенным типом наследования. Возможные значения:
- #all - в XML-документах запрещена замена данного элемента его производными, созданными любым способом;
- extension - запрещена замена в XML-документах данного элемента его производными элементами, полученными путем расширения типа данного элемента;
- restriction - запрещена замена в XML-документах данного элемента его производными элементами, полученными путем ограничения типа данного элемента;
- substitution - в XML-документах запрещена любая замена данного элемента.
- Необязательный атрибут default устанавливает для элементов с простым типом данных значение по умолчанию.
- Необязательный атрибут final ограничивает тип наследования данного элемента. Возможные значения:
- #all - для данного элемента в XML-схеме запрещено создание производных любым способом;
- extension - для данного элемента в XML-схеме запрещено создание производных путем расширения типа данного элемента;
- restriction - для данного элемента в XML-схеме запрещено создание производных путем ограничения типа данного элемента.
- Необязательный атрибут fixed для элемента с простым типом данных задает неизменяемое значение. Атрибут является взаимоисключающим с атрибутом default.
- Необязательный атрибут form задает форму элемента. Возможные значения:
- qualified - элемент необходимо уточнять префиксом пространства имен;
- unqualified - элемент не обязательно уточнять префиксом пространства имен.
- Необязательный атрибут id - идентификатор элемента.
- Необязательный атрибут maxOccurs задает максимальное число появлений данного элемента в содержащем его элементе XML-документа. Возможные значения - целое число, большее или равное 0, или unbounded (без ограничений). Данный атрибут запрещен для глобального элемента.
- Необязательный атрибут minOccurs задает минимальное число появлений данного элемента в содержащем его элементе XML-документа. Возможные значения - целое число до 1 или 0 (элемент необязателен). Данный атрибут запрещен для глобального элемента.
- Необязательный атрибут name задает имя элемента в XML-документе. Атрибут является обязательным для глобального элемента.
- Необязательный атрибут nillable . Если значение атрибута true, тогда в XML- документе для элемента можно задать его содержимое пустым с помощью атрибута xsi:nil="true" . По умолчанию значение атрибута - false .
- Необязательный атрибут ref - ссылка на элемент этой или внешней схемы. Значение атрибута должно быть QName-имя элемента (префикс пространства имен и локальное имя элемента). Ссылаться можно только на глобальные элементы, т. е. элементы, являющиеся дочерними для корневого элемента schema . Данный атрибут запрещен для глобального элемента.
- Необязательный атрибут substitutionGroup задает имя элемента, который можно заменить данным элементом, при этом элемент должен иметь тот же тип данных или тип данных, унаследованный от типа данных указанного элемента. Значение атрибута должно быть QName-имя элемента.
- Необязательный атрибут type указывает QName-имя элементов simpleType или complexType , задающих тип данных элемента. Атрибут является взаимоисключающим с атрибутом ref . С помощью атрибута type можно прямо указать существующий тип данных элемента, например, type="xs:string" .
Элемент
Элемент
Элемент
обязательный name (имя элемента
Элементы
Элемент
Элемент
П РИМЕЧАНИЕ
XPath - это язык запросов к элементам XML-документа. Подробно язык XPath рассмотрен в приложении "Язык XPath" справки "Приложения" и PDF-файле в каталоге Приложения компакт-диска.
Элемент
- необязательный атрибут final накладывает ограничения на наследование данного простого типа с помощью возможных значений:
- #all - запрещает любое наследование;
- list - запрещает наследование списком;
- union - запрещает наследование объединением;
- restriction - запрещает наследование ограничением;
- необязательный атрибут id - идентификатор простого типа;
- атрибут name - имя типа, присутствует только в элементах
, дочерних для элемента schema .
Элемент или
Простые типы, объявляемые элементом
Создание простого типа, как производного, осуществляется с помощью вложенных элементов или
Элемент
- обязательный атрибут base указывает базовый тип, из которого создается данный производный простой тип. Базовый тип может быть встроенным типом XML Schema или уже объявленным простым типом;
- вложенный элемент
- документация; - вложенный элемент
- дочерний простой тип; - вложенный элемент
- вложенный элемент
- вложенный элемент
- вложенный элемент
- вложенный элемент
- вложенный элемент
- вложенный элемент
- вложенный элемент
- минимальное количество единиц длины, имеет атрибуты value, fixed и id; - вложенный элемент
- максимальное количество единиц длины, имеет атрибуты value, fixed и id; - вложенный элемент
- вложенный элемент
указывает для типов, производных от string, правила нормализации с помощью трех возможных значений атрибута value - preserve (нормализация не производится), replace (символы #x9 , #xA и #xD заменяются символом #x20), collapse (пробелы в начале и в конце удаляются, дублирующие пробелы объединяются в один). Имеет также атрибуты fixed и id; - вложенный элемент
Ограничивает область возможных значений шаблоном, основанным на регулярном выражении с помощью атрибута value.
Элемент определяет простой тип, как производный от существующего, путем создания списка, используя следующие атрибуты и вложенные элементы:
- необязательный атрибут id - идентификатор в пределах схемы;
- атрибут itemType - имя встроенного типа данных или уже объявленного простого типа. Атрибут обязательный, если нет дочернего элемента
, с которым он является взаимоисключающим; - вложенный элемент
- производный тип; - вложенный элемент
- документация.
Элемент
- необязательный атрибут id - идентификатор в пределах схемы;
- необязательный атрибут memberTypes - список имен встроенных типов данных или уже объявленных простых типов;
- вложенный элемент
определяет участника объединения; - вложенный элемент
- документация.
XML Schema поддерживает следующие встроенные типы данных.
- string - символьная строка. Встроенный производный тип данных - normalizedString (символьная строка с нормализацией пробелов). Встроенный производный тип данных от normalizedString - token (лексема), который также имеет встроенные производные типы данных - language (идентификатор языка), nmtoken (лексемы, соответствующие XML-типу атрибута nmtoken , имеет производный тип - nmtokens), Name (XML-имена, имеет производный тип - NCName). Встроенный тип NCName, часть XML-имени без двоеточия, имеет производные типы iD (идентификатор), iDREF (ссылка на идентификатор, имеет производный тип idrefs) и entity (XML-сущность, имеет производный тип entities).
- boolean - логическое значение true, false.
- decimal - десятичные числа. Встроенный производный тип данных - integer (целые числа). Производный тип данных integer имеет, в свою очередь, производные типы nonPositiveinteger (верхняя граница значений - 0, имеет производный тип negativelnteger - верхняя граница -1), nonNegativelnteger (нижняя граница значений - 0, имеет производные типы unsignedLong с верхней границей 18 446 744 073 709 551 615 и positiveinteger с нижней границей 1), long (значения от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807, имеет производный тип int со значениями от -2 147 483 648 до 2 147 483 647). Тип unsignedLong имеет производный тип unsignedint с верхней границей значений 4 294 967 295. Тип unsignedint имеет производный тип unsignedshort с верхней границей 65 535. Тип unsignedshort имеет производный тип unsignedByte с верхней границей 255. Тип int имеет производный тип short со значениями от -32 768 до 32 767. Тип short имеет производный тип byte со значениями от -128 до 127.
- float - числа с плавающей запятой.
- double - числа с плавающей запятой двойной точности.
- duration - промежуток времени (PnYn MnDTnH nMnS).
- dateTime - последовательность даты и времени.
- time - время (hh:mm:ss.sss).
- date - дата.
- gYearMonth - год и месяц.
- gYear - год.
- gMonthDay - месяц и день.
- gDay - день.
- gMonth - месяц.
- hexBinary - представление двоичных данных в виде последовательностей символов.
- base64Binary - Base64-коgировка двоичных данных.
- anyURi - URI-адрес.
- QName - префикс, локальная часть имени.
- notation - значение одноименного XML-атрибута.
Элемент
- необязательный атрибут abstract . Если true, тогда в XML-документе используется сложный тип, производный от данного типа. По умолчанию значение атрибута - false;
- необязательный атрибут block ограничивает использование в XML-документе сложного типа с указанным типом наследования вместо данного сложного типа с помощью следующих возможных значений: #all (запрет использования вместо этого сложного типа всех производных сложных типов), extension (запрет использования вместо этого сложного типа всех производных сложных типов, созданных расширением), restriction (запрет использования вместо этого сложного типа всех производных сложных типов, созданных ограничением);
- необязательный атрибут final ограничивает тип наследования с помощью следующих возможных значений: #all (запрет наследования), extension (запрет наследования расширением), restriction (запрет наследования ограничением);
- необязательный атрибут id - идентификатор элемента;
- необязательный атрибут mixed . Если true, тогда в XML-документе возможно наличие символьных данных между дочерними элементами этого типа. По умолчанию значение атрибута - false . Если есть дочерний элемент
, тогда использовать атрибут нельзя; - атрибут name - имя типа. Атрибут обязательный, если элемент является дочерним для элемента
, в других случаях использовать атрибут нельзя.
Элементы с простым типом данных могут содержать только символьные данные и не могут включать атрибуты и другие элементы.
Сложный тип определяет содержимое элементов XML-документа, которые могут включать в себя атрибуты и другие элементы.
Элемент
Элемент
Элемент
- обязательный атрибут base указывает базовый тип, из которого создается данный производный сложный тип. Базовый тип может быть встроенным типом XML Schema или уже объявленным простым типом или сложным типом;
- необязательный атрибут id - идентификатор в пределах схемы;
- вложенный элемент
- документация; - вложенный элемент
- дочерний простой тип; - вложенный элемент
указывает исключающую нижнюю границу области значений с помощью атрибута value. Имеет также атрибуты fixed (если true, тогда значение value является неизменяемым для производных, по умолчанию - false) и id (идентификатор); - вложенный элемент
указывает включающую нижнюю границу области значений с помощью атрибута value. Имеет также атрибуты fixed и id; - вложенный элемент
указывает исключающую верхнюю границу области значений с помощью атрибута value. Имеет также атрибуты fixed и id; - вложенный элемент
указывает включающую верхнюю границу области значений с помощью атрибута value. Имеет также атрибуты fixed и id; - вложенный элемент
- максимальное количество десятичных знаков перед запятой для типов, унаследованных от decimal с помощью атрибута value. Имеет также атрибуты fixed и id; - вложенный элемент
- максимальное количество десятичных знаков после запятой для типов, унаследованных от decimal с помощью атрибута value. Имеет также атрибуты fixed и id; - вложенный элемент
- количество единиц длины, для строк - это количество символов, для двоичных данных hexBinary и base64Binary - это 8 бит, для списков - это количество элементов списка. Элемент имеет атрибуты value, fixed и id; - вложенный элемент
- минимальное количество единиц длины. Элемент имеет атрибуты value, fixed и id; - вложенный элемент
- максимальное количество единиц длины и имеет атрибуты value, fixed и id; - вложенный элемент
ограничивает область возможных значений фиксированным набором значений с помощью атрибута value; - вложенный элемент
указывает для типов, производных от string, правила нормализации с помощью трех возможных значений атрибута value - preserve (нормализация не производится), replace (символы #x9, #xA и #xD заменяются символом #x20), collapse (пробелы в начале и в конце удаляются, дублирующие пробелы объединяются в один). Имеет также атрибуты fixed и id; - вложенный элемент
Ограничивает область возможных значений шаблоном, основанным на регулярном выражении с помощью атрибута value; - вложенный элемент
объявляет атрибут; - вложенный элемент
группирует атрибуты. Элемент имеет следующие атрибуты и вложенные элементы: - необязательный атрибут name - имя группы атрибутов, может использоваться, если родительский элемент -
; - необязательный атрибут ref - ссылка на группу атрибутов, взаимоисключающий атрибут с атрибутом name, может использоваться, если родительский элемент не является элементом
; - вложенные элементы
, , , ;
- вложенный элемент
разрешает любому атрибуту из указанного пространства имен появляться в содержащем их элементе. Элемент имеет следующие атрибуты: - необязательный атрибут id - идентификатор;
- необязательный атрибут namespace принимает одно из значений: ##any (по умолчанию могут включаться атрибуты из любого пространства имен), ##other (могут включаться атрибуты из любого пространства имен, которое не является целевым пространством имен родительского элемента), URI- идентификаторы пространств имен, ##targetNamespace (могут включаться атрибуты из целевого пространства имен родительского элемента), ##local (могут включаться локальные атрибуты, не принадлежащие пространству имен);
- необязательный атрибут processContents указывает способ проверки XML- документов, принимает одно из значений strict (по умолчанию, обязательная проверка атрибутов на соответствие указанному пространству имен), lax (необязательная проверка) и skip (проверка не производится).
Элемент
- обязательный атрибут base - базовый тип, из которого создается данный производный сложный тип. Базовый тип может быть встроенным типом XML Schema или уже объявленным простым типом или сложным типом;
- необязательный атрибут id - идентификатор в пределах схемы;
- вложенные элементы
, , , .
Элемент
Элементы
- обязательный атрибут base - базовый тип, из которого создается данный производный сложный тип. Базовый тип должен быть уже объявленным сложным типом;
- необязательный атрибут id - идентификатор в пределах схемы;
- вложенные элементы -
, , , , , , , .
Элемент
- необязательный атрибут id - идентификатор в пределах схемы;
- необязательный атрибут name - имя группы элементов, используется, если только родительский элемент -
; - необязательный атрибут maxOccurs - максимальное число появлений группы элементов в родительском элементе XML-документа. Значение атрибута unbounded снимет ограничение на максимальное число;
- необязательный атрибут minOccurs - минимальное число появлений группы элементов в родительском элементе XML-документа. Значение атрибута 0 указывает, что появление группы необязательно;
- необязательный атрибут ref - ссылка на имя уже определенной группы элементов. Атрибут является взаимоисключающим с атрибутом name;
- вложенные элементы
, , , .
Элемент
- необязательный атрибут id - идентификатор в пределах схемы;
- необязательный атрибут maxOccurs - максимальное число вхождений элемента. Значение атрибута должно быть равно 1;
- необязательный атрибут minOccurs - минимальное число вхождений данного элемента. Значение атрибута может быть 1 (по умолчанию) или 0 (элемент необязателен);
- вложенные элементы
, .
Элемент
- необязательный атрибут id - идентификатор в пределах схемы;
- необязательный атрибут maxOccurs - максимальное число появлений данного выбора элемента в родительском элементе XML-документа. Значение атрибута unbounded снимет ограничение на максимальное число. По умолчанию - 1;
- необязательный атрибут minOccurs - минимальное число появлений данного выбора элемента в родительском элементе XML-документа. Значение атрибута 0 указывает, что появление элемента необязательно. По умолчанию - 1;
- вложенные элементы
, , , , , .
Элемент
- необязательный атрибут id - идентификатор в пределах схемы;
- необязательный атрибут maxOccurs - максимальное число появлений данной последовательности элементов в родительском элементе XML-документа. Значение атрибута unbounded снимет ограничение на максимальное число. По умолчанию - 1;
- необязательный атрибут minOccurs - минимальное число появлений данной последовательности элементов в родительском элементе XML-документа. Значение атрибута 0 указывает, что появление последовательности необязательно. По умолчанию - 1;
- вложенные элементы
, , , , , .
Элемент
- необязательный атрибут default задает значение атрибута XML-документа по умолчанию;
- необязательный атрибут fixed задает неизменяемое значение атрибута XML- документа, является взаимоисключающим с атрибутом default ;
- необязательный атрибут form указывает, как атрибут должен представляться в XML-документе. Возможные значения атрибута - qualified (атрибут XML- документа уточняется значением атрибута targetNamespace элемента
) и unqualified (атрибут представляется только локальным именем); - необязательный атрибут id - идентификатор в пределах схемы;
- необязательный атрибут name - имя атрибута, является обязательным, если родительский элемент -
; - необязательный атрибут ref - ссылка на уже объявленный атрибут, является взаимоисключающим с атрибутами name, form, type и simpleType;
- необязательный атрибут type - указывает встроенный тип данных XML Schema или простой тип данных для значений атрибута XML-документа;
- необязательный атрибут use - определяет использование атрибута XML- документа. Возможные значения - optional (по умолчанию атрибут является необязательным), prohibited (использование атрибута запрещено), required (наличие атрибута обязательно);
- вложенные элементы
, .
Элемент
Элемент
- необязательный атрибут id - идентификатор в пределах схемы;
- обязательный атрибут name - имя нотации;
- необязательный атрибут system - системный URI-идентификатор нотации;
- обязательный атрибут public - публичный URI-идентификатор нотации.
На работе нас просят создать файлы XML для передачи данных в другое автономное приложение, которое затем создаст второй XML файл для возврата, чтобы обновить некоторые наши данные. Во время процесса мы обсуждали с командой другого приложения структуру XML файла.
Образец, с которым я столкнулся, по существу выглядит примерно так:
Другая команда заявила, что это не отраслевой стандарт, и что атрибуты должны использоваться только для метаданных. Они предложили:
Причина, по которой я предположил, что первый заключается в том, что размер создаваемого файла намного меньше. Будет около 80000 элементов, которые будут в файле во время передачи. На самом деле предложение действительно в три раза больше, чем я предложил. Я искал загадочный "отраслевой стандарт", который был упомянут, но ближайший, который я мог найти, - это атрибуты XML, которые должны использоваться только для метаданных, но сказал, что дискуссия о том, что было фактически метаданными.
После долгого объяснения (извините), как вы определяете, что такое метаданные, и при разработке структуры документа XML, как вы должны решить, когда использовать атрибут или элемент?
20 ответов
Я использую это правило:
- Атрибут - это то, что является самодостаточным, т.е. цвет, идентификатор, имя.
- Элемент - это то, что делает или может иметь собственные атрибуты или содержать другие элементы.
Итак, ваш близок. Я бы сделал что-то вроде:
EDIT : обновлен исходный пример, основанный на обратной связи ниже.
Некоторые из проблем с атрибутами:
- атрибуты не могут содержать несколько значений (дочерние элементы могут)
- атрибуты не просто расширяемы (для будущих изменений)
- атрибуты не могут описывать структуры (дочерние элементы могут)
- атрибуты сложнее манипулировать программным кодом Значения атрибутов
- нелегко протестировать против DTD
Если вы используете атрибуты в качестве контейнеров для данных, вы получаете документы, которые трудно читать и поддерживать. Попытайтесь использовать элементы для описания данных. Используйте атрибуты только для предоставления информации, не относящейся к данным.
Не заканчивайте так (это не то, как следует использовать XML):
"XML" означает "расширяемый язык разметки". Язык разметки подразумевает, что данные представляют собой текст, помеченный метаданными о структуре или форматировании.
XHTML - пример XML, используемый так, как он был предназначен:
El Jefe insists that you MUST complete your project by Friday.
Здесь различается различие между элементами и атрибутами. Текстовые элементы отображаются в браузере, а атрибуты - инструкции о том, как их отображать (хотя есть несколько тегов, которые не работают таким образом).
Путаница возникает, когда XML используется не как язык разметки, а как язык сериализации данных, в котором различие между "данными" и "метаданными" более неопределенно. Таким образом, выбор между элементами и атрибутами более или менее произволен, за исключением вещей, которые не могут быть представлены атрибутами (см. Ответ feenster).
XML - это соглашение. Сначала отложите все существующие схемы XML или установленные соглашения в рамках вашего сообщества или отрасли.
Если вы действительно в ситуации, чтобы определить свою схему с нуля, вот некоторые общие соображения, которые должны сообщать о выборе элемента vs :
Это может зависеть от вашего использования. XML, который используется для представления данных, созданных из базы данных, может хорошо работать, и в конечном итоге значения полей помещаются как атрибуты.
Однако XML, используемый в качестве транспорта сообщений, часто лучше использовать большее количество элементов.
Например, скажем, что у нас был этот XML, как предлагается в ответе: -
Теперь мы хотим отправить элемент ITEM на устройство для печати штрих-кода, однако есть выбор типов кодирования. Как мы представляем требуемый тип кодирования? Неожиданно мы несколько с опозданием понимаем, что штрих-код не является одним автоматическим значением, а скорее может быть квалифицирован с кодировкой, требуемой при печати.
Дело в том, что если вы не строите какой-либо XSD или DTD вместе с пространством имен, чтобы исправить структуру в камне, вам может быть лучше всего оставить свои варианты открытыми.
IMO XML наиболее полезен, когда его можно сгибать, не нарушая при этом существующий код.
Предпочтение атрибутов заключается в следующем:
- уникальный (атрибут не может появляться несколько раз)
- порядок не имеет значения
- вышеуказанные свойства наследуются (это то, что "все" модель содержимого не поддерживает на текущем языке схемы)
- бонус - они менее подробные и используют меньшую пропускную способность, но это не является основанием для предпочтения атрибутов над элементами.
Я добавил, когда технически возможно, потому что бывают случаи, когда использование атрибутов невозможно. Например, выбор набора атрибутов. Например использование (startDate и endDate) xor (startTS и endTS) невозможно с текущим языком схемы
Если XML Schema начинает разрешать ограниченную или расширенную модель контента "все", я бы, вероятно, сбросил ее
Нет универсального ответа на этот вопрос (я активно участвовал в создании спецификации W3C). XML может использоваться для многих целей - текстовые документы, данные и декларативный код являются тремя наиболее распространенными. Я также использую его как модель данных. Существуют аспекты этих приложений, где атрибуты более распространены и другие, где дочерние элементы более естественны. Существуют также функции различных инструментов, которые упрощают или упрощают их использование.
XHTML - это одна область, где атрибуты имеют естественное использование (например, в class= "foo"). Атрибуты не имеют порядка, и это может облегчить для некоторых людей разработку инструментов. Атрибуты OTOH сложнее вводить без схемы. Я также нахожу атрибуты с именами (foo: bar = "zork"), которые зачастую сложнее управлять в различных наборах инструментов. Но посмотрите на некоторые из языков W3C, чтобы увидеть смесь, которая является общей. SVG, XSLT, XSD, MathML - некоторые примеры хорошо известных языков, и все они имеют богатый запас атрибутов и элементов. Некоторые языки даже допускают больше, чем один способ, например,
Обратите внимание, что они НЕ эквивалентны синтаксически и требуют явной поддержки в инструментах обработки)
Моим советом было бы взглянуть на обычную практику в ближайшей к вашей области, а также рассмотреть, какие инструменты вы можете применить.
Наконец, убедитесь, что вы различаете пространства имен из атрибутов. Некоторые XML-системы (например, Linq) представляют пространства имен в качестве атрибутов API. ИМО это уродливое и потенциально запутанное.
Другие рассмотрели, как различать атрибуты от элементов, но с более общей точки зрения, помещая все в атрибуты, потому что это делает полученный XML меньше ошибочным.
XML не предназначен для компактности, но для переносимости и чтения человеком. Если вы хотите уменьшить размер данных в пути, используйте другое (например, буферы протокола Google).
Это спорно так или иначе, но ваши коллеги правы в том смысле, что XML должен быть использован для "накрутку" или мета-данных вокруг фактических данных. Со своей стороны, вы правы в том, что иногда трудно решить, где линия между метаданными и данными при моделировании вашего домена в XML. На практике я делаю вид, что что-то в разметке скрыто, и только данные вне разметки читаются. Имеет ли этот документ какой-то смысл?
XML, как известно, громоздкий. Для транспортировки и хранения настоятельно рекомендуется сжатие, если вы можете позволить себе вычислительную мощность. XML сжимается хорошо, иногда феноменально хорошо, из-за его повторяемости. У меня было сжатие больших файлов до менее чем 5% от их первоначального размера.
Еще один момент, чтобы укрепить вашу позицию, заключается в том, что в то время как другая команда спорит о стиле (в том, что большинство инструментов XML будут обрабатывать полностью атрибутный документ так же просто, как и документ all-# PCDATA), вы утверждаете практичность. Хотя стиль не может быть полностью проигнорирован, технические достоинства должны нести больше веса.
Использовать элементы для данных и атрибутов для метаданных (данные о данных элемента).
Если элемент отображается как предикат в ваших строках выбора, у вас есть хороший знак того, что он должен быть атрибутом. Аналогично, если атрибут никогда не используется как предикат, то, возможно, это не полезные метаданные.
Помните, что XML должен быть машиносчитываемым, не читаемым человеком, а для больших документов XML сжимается очень хорошо.
Как насчет того, чтобы использовать нашу интуицию, ориентированную на твердую заработную плату? Обычно я считаю, что прямо думать о том, что является объектом и является атрибутом объекта или объекта, на который он ссылается.
Каким бы интуитивно не было смысла, поскольку объекты должны вписываться в элементы. Его атрибуты (или свойства) будут атрибутами для этих элементов в xml или дочернем элементе с атрибутом.
Я думаю, что для более простых случаев, как в примере, аналогия объектной ориентации работает нормально, чтобы определить, что является элементом и который является атрибутом элемента.
вопрос в миллион долларов!
Вначале не беспокойтесь о производительности. вы будете удивлены тому, как быстро оптимизированный синтаксический анализатор xml будет копировать ваш XML файл. что более важно, каков ваш дизайн на будущее: по мере развития XML, как вы будете поддерживать свободную связь и функциональную совместимость?
более конкретно, вы можете сделать контентную модель элемента более сложной, но сложнее расширить атрибут.
В основном это вопрос предпочтения. Я использую Elements для группировки и атрибуты для данных, где это возможно, поскольку я считаю это более компактным, чем альтернатива.
Например, я предпочитаю.....
Вместо....
Однако, если у меня есть данные, которые не могут легко отображаться внутри, например, 20-30 символов или содержат много кавычек или других символов, которые нужно экранировать, я бы сказал, что это время, чтобы разбить элементы... возможно, с блоками CData.
Как и в HTML, XML элементы могут иметь атрибуты. При этом значение атрибутов в XML и правило их создания во многом похожи на .
Атрибуты предоставляют дополнительную информацию об элементе.
XML атрибуты
В HTML атрибуты предоставляют некоторую дополнительную информацию об элементе:
Атрибуты часто предоставляют информацию, не являющуюся частью данных. В примере ниже тип файла не зависит от данных, но эта информация может быть важна для приложений, которые будут манипулировать этим элементом:
XML атрибуты должны заключаться в кавычки
Значение атрибута всегда должно заключаться в кавычки. Это могут быть либо двойные, либо одинарные кавычки. Например, пол персонажа можно записать так:
либо так:
Если значение атрибута само содержит двойные кавычки, то можно использовать одинарные кавычки. Например:
либо использовать символы сущностей:
XML элементы или атрибуты
Посмотрите на следующие примеры:
Пример №1
Пример №2
В первом примере пол указан в атрибуте. Во втором, пол записан, как элемент. Оба примера предоставляют одну и ту же информацию.
Нет правил, регулирующих то, когда использовать атрибуты, а когда элементы. Атрибуты широко используются в HTML. В XML, на мой взгляд, лучше их избегать, и вместо них использовать элементы.
Что лучше?
Следующие три XML документа содержат совершенно одинаковую информацию:
Дата записана, как атрибут :
Дата записана, как элемент :
Дата записана, как расширенный элемент (На мой взгляд наилучший вариант):
Избегать XML атрибуты?
При использовании атрибутов возникают некоторые проблемы:
- атрибуты не могут содержать множественные значения (элементы могут)
- атрибуты не могут содержать древовидные структуры (элементы могут)
- атрибуты сложно расширять (для будущих изменений)
Никогда не используйте следующие конструкции:
XML атрибуты для метаданных
Иногда элементам присваивают идентификаторы. Эти идентификаторы используются для идентификации XML элементов в точности также, как идентификационные атрибуты в HTML. Следующий пример демонстрирует это:
В приведенном примере атрибут id используется для идентификации разных заметок. Эта информация не является частью самой заметки.
Главная мысль всего сказанного это то, что метаданные (данные о данных) следует записывать, как атрибуты, а сами данные, как элементы.