Chase N.Проверка правильности XML
Целевой документ
Полный пример XML-файла для проверки правильности в этом учебнике состоит из информации, которая является частью Проекта Памяти Тысячелетия, в котором собрана коллекция подаренных домашних видео и других записей личных историй для потомков.Каждый экспонат содержит данные и информацию о них, такую, как имя дарителя, место и тема.
Что такое проверка правильности XML?
При создании базы данных, использование модели данных в сочетании с ограничениями целостности дает гарантию, что структура и содержимое данных соответствуют требованиям. Но как вы проведете в жизнь этот вид контроля при использовании XML, когда ваши данные - это просто текст в файлах, которые можно редактировать вручную? К счастью, проверка правильности файлов и документов дает гарантию того, что данные соответствуют ограничениям. В этом учебнике вы изучите, что такое проверка правильности и как проверить документ по DTD или схеме XML документа.DTD были исходно определены в XML 1.0 Recommendation и происходят из Standard Generalized Markup Language (SGML), предшественника HTML. Их синтаксис немного отличается от XML, что является одной из помех для их использования. Они также имеют ограничения в применении, что заставило разработчиков искать им альтернативу в схемах XML. Однако DTD все еще используются в значительном количестве сред, так что понимание их является важным.
Главной альтернативой DTD является рекомендация XML Schema, поддерживаемая консорциумом World Wide Web (W3C). (Во всем этом учебнике, "схема XML" является синонимом "схема XML W3C".) Схемы, которые также являются XML-документами, обеспечивают более знакомую и более мощную среду, в которой ограничения на данные могут существовать как XML-документ.
До конца учебника вы изучите, как создавать и DTD, и документ схемы XML. Вы также изучите концепции использования их для проверки правильности XML-документов.
Что такое проверка правильности?
XML-файлы разрабатываются так, чтобы они могли легко читаться и редактироваться людьми. Они также разрабатываются для легкого обмена данными между разными системами и разными приложениями.К сожалению, оба эти преимущества могут работать против того, чтобы данные были в специфическом формате. Проверка правильности позволяет подтвердить, что XML-данные следуют заданной предопределенной структуре. Эта структура может быть обеспечена несколькими различными способами, включая DTD и схемы XML.
Документ, который был проверен таким способом по DTD или схеме, рассматривается, как правильный документ.
Документ экземпляра схемы XML
В отличие от DTD, документы схемы XML строятся на самом XML. Проверка правильности при помощи схемы требует двух документов: документа схемы и документа экземпляра.Документ схемы - это документ, содержащий структуру, а документ экземпляра содержит сами XML-данные. Приложение определяет схему для документа экземпляра одним из двух способов:
Сначала создайте само пространство имен, а затем используйте атрибут noNamespaceSchemaLocation для определения местоположения. Схемы могут также создаваться для определенного целевого пространства имен. В таком случае задавайте targetNamespace в самом документе схемы.
ID и IDREF
У вас может появиться необходимость связать данные при помощи использования идентификаторов, работа которых соответствует первичным и внешним ключам в реляционной базе данных. Например, может потребоваться, чтобы идентификатор memory соответствовал идентификатору media, носителя, на котором эта запись размещена. Типы данных ID и IDREF позволяют вам обеспечить такую целостность данных:Эта запись добавляет в файл два ограничения. Во-первых, значение каждого mediaid должно быть уникальным, значение каждого tapeid должно соответствовать существующему mediaid.
Каждый элемент может иметь максимум один атрибут ID. Важно понимать, что все значения ID должны принадлежать к одному пулу (пространству значений). Если вы задаете более одного типа атрибутов ID, у вас нет способа заставить IDREF ссылаться на определенный атрибут ID.
Инструменты
Примеры этого учебника, если вы решите их выполнить, требуют, чтобы вы установили следующие инструменты и убедились, что они работают правильно. Выполнение примеров не является обязательным для понимания материала.Если у вас инсталлирован другой набор инструментов, вы можете использовать его. Только проверьте в документации инструкции по настройке проверки правильности. Вы можете выгрузить реализации Xerces для C++ и Perl в проекте Apache на .
Элементы и встроенные типы
XML-документы строятся из элементов. Определение элемента в документе схемы XML состоит в придании ему имени и типа. Например:Это простые элементы, которые содержат только текст. Элемент subdate, однако, должен быть ограничен датой в формате yyyy-mm-dd, как определено в рекомендации W3C XML Schema.
42 простых типа определены как часть этой рекомендации, включая string, int, date, decimal, boolean, timeDuration и uriReference.
Вы также можете создавать новые типы.
Элементы
Независимо от того, имеем мы дело с внешними или внутренними DTD, элементы являются фундаментом XML-документов, так что они обычно определяются первыми.Все определения элементов состоят из ключевого слова ELEMENT, имени элемента и содержимого, которое может в нем быть. Элемент может содержать текст, другие элементы или ничего вообще (в случае пустого элемента).
Элемент, который содержит текст, определяется с ключевым словом #PCDATA. Это сокращение для разбираемых символьных данных (parsed character data); оно относится к любому тексту внутри элемента и не может содержать разметку. Примерами являются элементы subdate, donor и subject.
Элементы memory и memories показывают синтаксис, используемый для задания элементов, которые содержат в себе только другие элементы.
Элемент может также быть определен как EMPTY, как элемент media. Пустые элементы обычно несут всю информацию в атрибутах. Например:
Как работает процесс проверки правильности
Документы, используемые для описания структуры файлов, являются простыми текстовыми файлами. Полезно, однако, понимать, как они используются приложением, которое выполняет конкретную проверку правильности. В этом учебники в примерах используется код Java, но вам необязательно действительно выполнять проверку правильности, чтобы понять конструкцию документов.Прежде, чем XML-документы можно будет использовать, они должны быть разобраны, обычно с созданием либо документа DOM, либо потока SAX. В другом случае парсер рассматривает каждый символ документа и решает, является ли он элементом, атрибутом строкой данных и т.п.
Парсер может также проверять структуру документа по DTD или схеме, если он был сконфигурирован для этого. Это обычно делается в установках парсера или объекта, который создает парсер.
При проверке, если возникает проблема - такая, как неправильная вложенность элементов или ошибочные атрибуты, - вы должны обработать ее. Это делается посредством класса, который разрабатывается как обработчик ошибок.
Модификаторы (*,+ и ?)
DTD, которое создавалось до сих пор, является весьма специфичным. Каждый элемент должен появляться один раз и точно в таком порядке. Единственным исключением из этого является location, где должен появляться либо place, либо description, но не оба вместе.Модификаторы предлагают большую гибкость в проекте. Они таковы:
Код, приведенный ниже, показывает DTD, модифицированный таким образом, что количество элементов memory является неограниченным. Он также показывает, что требуется хотя бы один элемент subject, но допускается и более одного. Наконец, элемент donor не является обязательным, но если оно есть, оно может появляться только один раз. Немодифицированные элементы должны появляться один и только один раз.
(memory)* > donor?, subject+,
location) > ]>
Заметьте, что это ограничения на элемент. Элемент donor может появляться только один раз в элементе memory, но может появляться в каждом экземпляре memory, если нужно.
Необязательные и повторяющиеся элементы
До сих пор все элементы и атрибуты, добавляемые в схему, должны были появляться ровно один раз. Очевидно, что это не всегда желательно. Используя minOccurs и maxOccurs, вы можете управлять тем, должен ли компонент появляться обязательно и может ли он повторяться. В данном примере схема требует, чтобы элемент subject присутствовал, и позволяет ему появляться до пяти раз в одном элементе:...
Иногда вам не нужен верхний предел. Например, элемент memory может быть определен как необязательный, но если он есть, он может появляться неограниченное число раз в элементе memories:
type="memoryType"/>
Эта возможность становится очень полезной, когда мы имеем дело со смешанным содержимым в схеме.
Неограничиваемый порядок
Иногда может ограничиваться содержимое элемента, но не порядок, в котором оно появляется. Это, в частности, так для смешанного содержимого в схемах. Чтобы создать элемент, который не ограничивает порядок его потомков, используйте элемент all вместо sequence.Заметьте, что maxOccurs установлен в 1, а не в unbounded. Это обязательно для применения элемента all. Атрибуты minOccurs и maxOccurs должны быть либо 0, либо 1. Комбинирование и вложение этих групп может создавать элементы, в которых ограничены типы элементов, но не их порядок или повторяемость.
Документы схемы также поддерживают полностью неограниченные элементы.
Нужен ли мне этот учебник?
Этот учебник исследует проверку правильности XML-документов при помощи либо Описаний Типа Документов (Document Type Definition - DTD), либо схем XML. Он предназначен для разработчиков, которым нужно управлять типами и содержимым данных в их XML-документах, и предполагает, что вы знакомы с базовыми концепциями XML. (Вы можете получить базовое представление о самом XML в учебнике .) Он также предполагает базовое знакомство с пространствами имен XML. (Вы можете найти базовые сведения о пространствах имен в учебнике .)Этот учебник демонстрирует проверку правильности с использованием языка Java из командной строки, но принципы и концепции проверки правильности те же и для любой программной среды, так что опыт в технологии Java не является необходимым для достижения понимании. DTD и схема XML являются языково- и платформенно-независимыми.
Об авторе
Nicholas Chase, автор , участвовал в разработке Web-сайтов для таких компаний, как Lucent Technologies, Sun Microsystems, Oracle и Tampa Bay Buccaneers. Nick был преподавателем физики в высшей школе, менеджером низшего звена по использованию радиоактивных отходов, редактором онлайнового журнала научной фантастики, инженером по мультимедиа и инструктором по Oracle. В последнее время он - руководитель технического отдела фирмы Site Dynamics Interactive Communications в Clearwater, Florida, USA и автор четырех книг по Web-разработке, включая (Sams). Он любит слышать отзывы читателей, с ним можно связаться по адресу nicholas@nicholaschase.com.Обратная связь
Пожалуйста, присылайте ваши отзывы об этом учебнике. Мы заинтересованы в том, чтобы услышать ваше мнение!Кроме того, вы можете напрямую связаться с автором, Nicholas Chase, nicholas@nicholaschase.com
Ограничения DTD
DTD чрезвычайно ограничены, если идет речь о реальных типах данных, которые могут в них включаться. Например, DTD не может ограничить данные только числовым типом или типом даты. Атрибуты могут быть ограничены уникальностью значений, как ID, но в DTD нет способа определить, какого типа данных они должны быть. (И, странно, ID не может быть числом, что противоречит общепринятой практике реляционных баз данных!)Ограничения могут также применяться к . Кроме того, не более одного элемента может использовать определенное имя, так что вы не можете создать разные определения элемента, которые могут появляться в разных контекстах (таких, как потомки двух разных родителей).
Вы можете преодолеть эти трудности, используя схему XML.
Определение атрибутов
Хотя и возможно создать структуру XML, которая не содержит ничего, кроме элементов, более общей ситуацией является ситуация элементов с атрибутами. Атрибуты должны также быть определены, если они появляются в элементах правильного документа.Вы можете определить атрибуты несколькими способами. Первый - просто определить их как символьные данные или CDATA:
В этом случае DTD назначает элементу memory атрибут tapeid. Атрибут tapeid состоит из символьных данных и является обязательным. Элемент может также быть определен как #IMPLIED или #FIXED, в этом случае должно быть также задано значение по умолчанию.
Некоторые атрибуты перечисляемые, это значит, что значение должно выбираться из предопределенного списка. Например:
В этом случае документ должен выбрать значение из списка, если же значение не обеспечено, парсер использует значение по умолчанию 8mm. Это случай для любого документа, для которого существует DTD, даже, если парсер непроверяющий. В одном определении ATTLIST может быть определено много атрибутов:
Второй способ определения атрибутов включает в себя ID и IDREF.
Определения Типа Документа (DTD)
Когда XML изначально создавался, он был одним из приложений Стандартного Обобщенного Языка Разметки (Standard Generalized Markup Language - SGML). SGML дает возможность различным системам сообщаться друг с другом, позволяя авторам создавать DTD. Пока данные следуют DTD, каждая система может прочитать и интерпретировать их.DTD определяют элементы, которые допустимы в документе, что они могут содержать и какие атрибуты они должны иметь.
Сравним этот простой документ с его DTD:
DTD
DTD использует синтаксис, отличный от XML, но оно описывает различные элементы и атрибуты и, как они могут применяться. Более подробная информация об использовании и создании DTD будет дана в этом учебнике позже, пока же отметим, что DTD связывается с XML-документами через оператор DOCTYPE.