Разработка веб-служб средствами Java. Ильдар ХабибуллинРазработкаWebслужбсредствами
![]()
|
Это словесное описание, называемое схемой документа XML, формализует- ся несколькими способами. Наиболее распространены два способа: можно сделать описание DTD, пришедшее в XML из SGML, или описать схему на языке XSD. Описание DTD Описание DTD нашей адресной книжки записано в листинге 1.3. ' Листинг 1.3. Описание DTD документа XML notebook (person)*> name EMPTY> first CDATA #IMPLIED second CDATA surname CDATA birthday (#PCDATA)> (#PCDATA)> city (#PCDATA)> type (город | поселок I деревня) zip (#PCDATA)> phone-list (work-phone*, home-phone*)> work-phone (#PCDATA)> home-phone Разработка Web-служб средствами Java Как видите, описание DTD почти очевидно. Оно повторяет приведенное выше словесное описание. Первое слово ELEMENT означает, что элемент может содержать тело с вложенными элементами. Вложенные элементы перечисляются в круглых скобках. Порядок перечисления вложенных элементов в скобках должен соответствовать порядку их появления в до- кументе. Слово EMPTY в третьей строке листинга 1.3 означает пустой элемент. Слово ATTLIST начинает описание списка атрибутов элемента. Для каждого атрибута указывается имя, тип и обязательность указания атрибута. Типов атрибута всего девять, но чаще всего употребляется тип CDATA (Character DATA), означающий произвольную строку символов Unicode, или перечис- ляются значения типа. Так сделано в описании атрибута type тега принимающего одно из трех значений город, поселок или деревня. В ка- вычках показано значение по умолчанию город. Обязательность указания атрибута отмечается одним из трех слов: • #REQUIRED — атрибут обязателен, • — атрибут необязателен, • — значение атрибута фиксировано, оно задается в DTD. Первым словом могут быть, кроме слов ELEMENT ИЛИ ATTLIST, слова ANY, MIXED или ENTITY. Слова ANY и MIXED, означают, что элемент может содер- жать и простые данные и/или вложенные элементы. Слово ENTITY означает обозначение или адрес данных, записанный в описании DTD, так называе- мую сущность. После имени элемента в скобках записываются вложенные элементы или тип данных, содержащихся в теле элемента. Тип PCDATA (Parsed Character DATA) означает строку символов Unicode, которую надо интерпретиро- вать. Звездочка, записанная после имени элемента, означает "нуль или более вхождений" данного элемента, а плюс — "одно или более вхождений". Во- просительный знак означает "нуль или один раз". Если эти символы отно- сятся ко всем вложенным элементам, то их можно указать после круглой скобки, закрывающей список вложенных элементов. Описание DTD можно занести в отдельный файл, например, ntb.dtd, указав его имя во второй части пролога, как показано во второй строке листин- гов 1.1 и 1.2. Можно включить описание во вторую часть пролога XML- файла, заключив его в квадратные скобки: notebook [ Описание DTD ]> После того как создано описание DTD нашей реализации XML и написан документ, размеченный тегами этой реализации, следует проверить пра- Глава 1. Обработка документов XML 23 вильность их написания. Для этого есть специальные программы — прове- ряющие анализаторы (validating parsers). Все фирмы, разрабатывающие сред- ства для работы с XML, выпускают бесплатные или коммерческие прове- ряющие анализаторы. Например, фирма IBM выпускает анализатор xml4j, входящий в состав сервера приложений WebSphere. Его можно использовать и отдельно, свободно загрузив с адреса архи- вы xml4j.jar, xerces.jar и xercesSamples.jar. Проверяющий анализатор фирмы Sun Microsystems содержится в пакете классов JAXP (Java API for XML Processing, интерфейс программирования приложений на Java для обработки XML), входящем в состав и J2SDK Standard Edition, и J2SDK Enterprise Edition [10]. Кроме того, этот пакет можно загрузить отдельно или в составе пакета Java XML Pack с адреса Корпорация Microsoft поставляет проверяющий анализатор MSXML (Microsoft XML Parser), доступный по адресу http://msdn.microsoft.com/xml/. Есть еще множество проверяющих анализаторов, но лидером среди них яв- ляется, пожалуй, Apache Xerces 2, входящий во многие средства обработки документов XML, выпускаемые другими фирмами. Он свободно доступен по адресу Ограниченные средства DTD не позволяют полностью описать структуру документа В частности, описание DTD не указывает точное количе- ство повторений вложенных элементов, оно не задает точный тип тела эле- мента. Например, в листинге 1.3 из описания DTD не видно, что в элемен- те содержится дата рождения. Эти недостатки DTD привели к появлению других схем описания документов XML. Наиболее развитое опи- сание дает язык XSD. Мы будем называть описание на этом языке просто схемой XML Schema). Посмотрим, как создаются схемы XML, но сначала познакомимся еще с одним понятием XML — пространством имен. Пространство имен тегов Поскольку в разных языках разметок — реализациях XML — могут встре- титься одни и те же имена тегов и их атрибутов, имеющие совершенно раз- ный смысл, а в документе XML их часто приходится смешивать, анализато- ру надо дать возможность их как-то различать. Для этого имена тегов и ат- рибутов снабжают префиксом, который отделяется от имени двоеточием. Префикс имени связывается с идентификатором, определяющим простран- ство имен (namespace). Все имена тегов и атрибутов, префиксы которых связаны с одним и тем же идентификатором, образуют одно пространство 24 Разработка Web-служб средствами Java имен. Префикс и идентификатор пространства имен определяются атрибу- том следующим образом: = Как видите, префикс ntb только что определен, но его уже можно исполь- зовать в имени В дальнейшем имена тегов и атрибутов, кото- рые мы хотим отнести к пространству имен снабжаются префиксом ntb, например: Имя вместе с префиксом, например, называется расширенным или уточненным именем (Qualified Name). Идентификатор пространства имен должен иметь форму URI. Адрес URI, такой как не имеет никакого значения и может не соответствовать никакому действительному адресу. Анализатор документа XML и другие программы, использующие документ, не будут об- ращаться по этому адресу. Там даже нет никакой Web-странички. Просто идентификатор пространства имен должен быть уникальным во всем Ин- тернете, и разработчики рекомендации по применению пространства имен, которую можно посмотреть по адресу http://www.w3.org/TR/1999/REC-xml- справедливо решили, что будет удобно использовать для него DNS-имя сайта, на котором размещено определение пространства имен. Смотрите на URI просто как на строку символов, идентифицирую- щую пространство имен. Обычно указывается URL (Universal Resource Locator, адрес универсальных ресурсов) фирмы, создавшей данную реализа- цию XML, или имя файла с описанием схемы XML. По правилам SGML и XML двоеточие может применяться в именах как обычный символ, поэтому имя с префиксом — это просто фокус, анали- затор рассматривает его как обычное имя. Отсюда следует, что в описа- нии DTD нельзя опускать префиксы имен. Некоторым анализаторам на- до специально указать необходимость учета пространства имен. Напри- мер, при работе с анализатором Xerces надо применить метод Атрибут xmins может появиться в любом элементе XML, а не только в кор- невом элементе. Определенный им префикс можно применять в том эле- менте, в котором записан атрибут xmins, и во всех вложенных в него эле- ментах. Больше того, в одном элементе можно определить несколько про- странств имен: xmlns:ntb = = "http://some.firm.com/2003/bookral"> Глава 1. Обработка документов XML 25 Появление имени тега без префикса в документе, использующем простран- ство имен, означает, что имя принадлежит пространству имен по умолчанию (default namespace). Например, язык XHTML допускает применение тегов HTML и тегов XML в одном документе. Допустим, мы определили тег с именем t i t l e . Чтобы анализатор не принял его за один из тегов HTML, поступаем следующим образом: = = "http://some.firm.com/2002/ntbml"> Java Web Разработка Web-служб средствами Java документа XML. Корневой компонент схемы носит имя Компо- ненты схемы описывают элементы XML и определяют различные типы элементов. Рекомендация схемы XML, которую можно посмотреть по адре- су http://www.w3.org/xml/schema/, перечисляет 13 типов компонентов, но наиболее важны компоненты, определяющие простые и сложные типы эле- ментов, сами элементы и их атрибуты. Язык XSD различает простые и сложные элементы XML. Простыми (simple) элементами описываемого документа XML считаются элементы, не содер- жащие атрибутов и вложенных элементов. Соответственно, сложные (complex) элементы содержат атрибуты и/или вложенные элементы. Схема XML описывает простые типы — типы простых элементов, и сложные ти- пы — типы сложных элементов. Язык описания схем содержит много встроенных простых типов. Они пере- числены в следующем разделе. Встроенные простые типы XSD Встроенные типы языка описания схем XSD позволяют записывать двоич- ные и десятичные целые числа, вещественные числа, дату и время, строки символов, логические значения, адреса URI. Рассмотрим их по порядку. Вещественные числа Вещественные числа в языке XSD разделены на три типа: decimal, float и double. Тип decimal составляют вещественные числа, записанные с фиксированной точкой: 123.45, —0.1234567689345 и так далее. Фактически хранятся два це- лых числа: мантисса и порядок. Спецификация языка XSD не ограничивает количество цифр в мантиссе, но требует, чтобы можно было записать не менее 18 цифр. Этот тип легко реализуется классом входящем в стандарт Java API (Application Programming Interface, интерфейс программирования приложений) [9]. Типы float и double соответствуют стандарту и одноименным типам Java [9]. Они записываются с фиксированной или с плавающей деся- тичной Целые числа Основной целый тип integer понимается как подтип типа decimal, содер- жащий числа с нулевым порядком. Это целые числа с любым количеством десятичных цифр: -34567, 123456789012345 и так далее. Этот тип легко реа- лизуется классом [9]. Глава 1. Обработка документов XML 27 Типы long, int, short и byte полностью соответствуют одноименным ти- пам Java. Они понимаются как подтипы типа integer, типы более коротких чисел считаются подтипами более длинных чисел: тип byte — это подтип типа short, оба они подтипы типа int, и так далее. Типы И — ПОДТИПЫ integer — составлены из неположительных и отрицательных чисел соответственно с любым количеством цифр. Типы И — ПОДТИПЫ типа integer — составлены из неотрицательных и положительных чисел соответственно с любым количеством цифр. У типа nonNegativelnteger есть подтипы беззнаковых целых чисел: unsignedLong, unsignedShort И unsignedByte. Строки Основной символьный тип string описывает произвольную строку симво- лов Unicode. Его можно реализовать классом Тип — подтип типа string — это строки, не содержащие символы перевода строки возврата каретки и символы горизон- тальной табуляции В строках типа token — подтипа типа normaiizedstring — нет, кроме того, начальных и завершающих пробелов и нет нескольких подряд идущих про- белов. В типе token выделены три подтипа. Подтип language определен для запи- си названия языка согласно RFC 1766, например, ru, en, de, fr. Подтип используется только в атрибутах для записи их перечисляемых зна- чений. Подтип name составляют имена XML — последовательности букв, цифр, дефисов, точек, двоеточий, знаков подчеркивания, начинающиеся с буквы (кроме зарезервированной последовательности букв X, х, М, m, L, 1 в любом сочетании регистров) или знака подчеркивания. Двоеточие в значе- ниях типа name используется для выделения префикса пространства имен. Из типа name выделен подтип NCName (Non-Colonized Name) имен, не со- держащих двоеточия, в котором, в свою очередь, определены три подтипа ID, ENTITY, описывающие идентификаторы XML, сущности и пере- крестные Дата и время Тип duration описывает промежуток времени, например, запись означает один год два месяца (2м), три дня (3D), Разработка Web-служб средствами Java десять часов тридцать минут (зом) и сорок пять секунд (4 5s). Запись может быть сокращенной, например, означает 120 месяцев, а Т120М — 120 минут. ТИП И время В формате Ha- пример, 2003-04-25Т09:30:05. Остальные типы выделяют какую-либо часть даты или времени. Тип time содержит В обычном формате Тип date содержит дату в формате Тип выделяет год и месяц в формате Тип содержит месяц и день месяца в формате -MM-DD. Тип gYear означает год в формате CCYY, ТИП gMonth — месяц в формате - мм-, тип gDay — день месяца в формате -DD. Двоичные типы Двоичные целые числа записываются либо в форме без всяких ДОПОЛНИТеЛЬНЫХ СИМВОЛОВ: 0B2F, 356С0А И далее, ЭТО — ТИП h e x B i n a r y , В кодировке Base64 [10], ЭТО — ТИП base64Binary. Прочие встроенные простые типы Еще три встроенных простых типа описывают значения, часто используе- мые в документах XML. Адреса URI относятся к типу Расширенное имя тега или атрибута (qualified name, то есть, имя вместе с префиксом, отделенным от имени двоеточием, — это тип QName. Элемент NOTATION описания DTD выделен как отдельный простой тип схе- мы XML. Его используют для записи математических, химических и других символов, нот, азбуки Бройля и прочих обозначений. Определение простых типов В схемах XML с помощью встроенных типов можно тремя способами опре- делить новые типы простых элементов. Они вводятся как сужение (restriction) встроенного или ранее определенного простого типа, список (list) или объединение (union) простых типов. Простой тип определяется компонентом схемы Глава 1. Обработка документов XML 29 Сужение Сужение простого типа определяется компонентом name="zip"> Можно дать другое определение простого типа zip как целого положитель- ного числа, находящегося в диапазоне от 100000 до 999999: value="100000" /> /> Теги , и другие теги, задающие ограничения, на- зываются фасетками (facets). Вот их список: • — наибольшее значение, оно уже не входит в опреде- ляемый тип; • — наибольшее значение определяемого типа; • мый тип; • — наименьшее значение определяемого типа; • — общее количество цифр в определяемом числовом ти- пе — сужении ТИПа decimal; • • значений определяемого типа; Разработка Web-служб средствами Java • — наибольшая длина значений определяемого типа; • — наименьшая длина значений определяемого типа; • — одно из перечисляемых значений; • — регулярное выражение [8]; • Атрибут value этого тега принимает одно из трех значений: • preserve — не убирать пробельные символы, • replace — заменить пробельные символы • collapse — после замены пробельных символов пробелами убрать начальные и конечные пробелы, а из нескольких подряд идущих про- белов оставить только один. В тегах-фасетках можно записывать следующие атрибуты, называемые ба- зисными фасетками facets): • ordered — задает упорядоченность определяемого типа, принимает одно из трех значений: • — тип неупорядочен, • p a r t i a l — тип частично упорядочен, • t o t a l — тип полностью упорядочен; • bounded — задает ограниченность или неограниченность типа значения- ми true ИЛИ false; • cardinality — задает конечность или бесконечность типа значениями finite ИЛИ countably infinite; • numeric — показывает, числовой этот тип или нет, значениями true или false. Как видно из приведенных выше и ниже примеров, в одном сужении может быть несколько ограничений-фасеток. При этом фасетки и Простой тип-список — это тип элементов, в теле которых записывается, через пробел, несколько значений одного и того же простого типа. Напри- Глава 1. Обработка документов XML 31 мер, в документе XML может встретиться такой элемент, содержащий спи- сок целых чисел: Список определяется компонентом в котором атрибутом указывается тип элементов определяемого списка. Тип элементов списка можно определить и в теле элемента Например, показанный выше элемент документа XML name="days" /> а использованный при его определении тип integer задать как спи- сок не более чем из пяти целых чисел следующим образом: При списка можно применять фасетки . В приведенном выше список — тело элемента |