2004 г.
Использование XInclude для синхронизации WSDL с исходными схемами
Юч Огбуджи (Uche Ogbuji)
Перевод Intersoft Lab
Импорт формата полезной нагрузки в случае использования описаний сообщений document/literal
Для того, чтобы формализовать XML-документ, который передается в Web-сервисе, в разделе types WSDL-файла можно разместить фрагмент XML-схемы. В большинстве случаев под этим понимается содержание тела сообщения SOAP (SOAP body). При использовании в Web-сервисе стиля RPC это обычно специализированный XML-формат, который преобразует конструкции XML-схемы W3C (W3C XML Schema, WXS) в формат SOAP. Такой подход характерен для Web-сервиса и не очень полезен вне его. Это разделение на XML-документ, который вероятно используется на уровне приложения в любой конечной точке (endpoint), и переданным формат часто является основной причиной критики использования в Web-сервисе стиля RPC и основанием для отстаивания стиля document/literal. Если читатель не знаком со стилем document/literal, необходимые сведения можно почерпнуть, обратившись к материалам, приведенным в разделе Ресурсы.
В случае использования стиля document/literal XML-формат, который весьма удобен для обработки на любой стороне, просто помещается в конверт и передается в низменном виде. Это означает, что подробности схемы, которые располагаются в разделе types WDDL, часто являются частью более широко используемой схемы. Этой схемой может быть даже известная схема, как, например, XHTML, Docbook или один из многочисленных XML-форматов для обмена бизнес-данными - UBL или OAGIS. Это означает, что включение этой схемы в WSDL-документы может привести к проблемам с синхронизацией или совместимостью. Что случится, если схема изменилась, а WSDL -нет? В этом случае могут возникнуть как ошибки, которые сложно определить, так и серьезные проблемы.
Инъекция включением
Конструкция XInclude, определенная консорциумом W3C, задает модель обработки и синтаксис для превращения ссылки на внешний документ в фактический XML в этом документе (или его части). Данный процесс называется включением (inclusion), он похож на инструкцию #include в C или C++. С технической точки зрения включение XML осуществляется объединением ряда информационных наборов XML в один составной Infoset. Если файл схемы хранится по какому-либо адресу, его можно включить в WSDL-файл. Предположим, что следующий документ должен быть отправлен в Web-сервисе, в котором используется стиль literal:
Листинг 1. Пример документа, отправляемого в Web-сервисе, в котором используется стиль literal
<?xml version="1.0" encoding="iso-8859-1"?>
<labels>
<label>
<quote>
Midwinter Spring is its own season
</quote>
<name>Thomas Eliot</name>
<address>
<street>3 Prufrock Lane</street>
<city>Stamford</city>
<state>CT</state>
</address>
</label>
<label>
<name>Ezra Pound</name>
<address>
<street>45 Usura Place</street>
<city>Hailey</city>
<state>ID</state>
</address>
</label>
</labels>
Данный формат формализуется в XML-схеме W3C следующим образом:
Листинг 2. XML-схема W3C для документа, отправляемого в стиле literal
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified"
>
<xs:element name="labels">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" maxOccurs="unbounded" ref="label"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="label">
<xs:complexType>
<xs:sequence>
<xs:element minOccurs="0" ref="quote"/>
<xs:element ref="name"/>
<xs:element ref="address"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="quote">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element ref="emph"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="emph" type="xs:string"/>
<xs:element name="name" type="xs:string"/>
<xs:element name="address">
<xs:complexType>
<xs:sequence>
<xs:element ref="street"/>
<xs:element ref="city"/>
<xs:element ref="state"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="street" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="state" type="xs:string"/>
</xs:schema>
Приведенный ниже пример (Листинг 3) - это раздел types из WSDL-файла, который включает необходимую часть определения схемы.
Листинг 3. Часть WSDL-файла, в котором для присоединения схемы используется XInclude
<types xmlns:xi="http://www.w3.org/2001/XInclude">
<schema>
<xi:include
href="http://example.com/labels.xsd"
xpointer="xmlns(xs=http://www.w3.org/2001/XMLSchema)
xpointer(/xs:schema/*)"
/>
</schema>
</types>
Лучше меньше, да лучше
Листинг 3 - это включение отнюдь не всего файла. В данном примере для WSDL требуются определения элемента из файла схемы, и поэтому для извлечения этого подмножества из всей схемы в Листинге 3 используется XPointer. В XPointer определено несколько схем для таких извлечений. Схема xmlns(...) определяет отображение пространств имен, а схема xpointer(...) задает выражения, которые определяют, какое подмножество документа будет использоваться. XPointer опирается на XPath, и выражение /xs:schema/* означает тоже самое, что и в XPath - то есть выбираются только потомки элемента xs:schema.
Важное замечание. Данный синтаксис XPointer соответствует требованиям Рабочей версии спецификации XPointer от 10 ноября 2003г., однако, он отличается от прежнего способа выражения XPointer в XInclude. Автор выяснил, что инструментальные средства пока еще не поддерживают последний вариант, и поэтому читателю, возможно, какое-то время придется пользоваться более ранней редакцией. Листинг 4 - эквивалент Листинга 3, записанный в соответствии с прежним синтаксисом XPointer.
Листинг 4. Вариант Листинга 3, в котором используются более ранний синтаксис XPointer
<types xmlns:xi="http://www.w3.org/2001/XInclude">
<schema>
<xi:include
href="http://example.com/labels.xsd#
xmlns(xs=http://www.w3.org/2001/XMLSchema)
xpointer(/xs:schema/*)"
/>
</schema>
</types>
Примечание. Часть, начинающаяся с "xmlns(", обычно располагается сразу после знака "решетка", а не со следующей строки, однако, для удобства восприятия отформатированного текста после этого знака был добавлен символ разрыва строки.
Заключение
XInclude - прост и поддерживается многими инструментальными средствами XML. Это удобный инструмент для многих ситуаций, который может помочь улучшить сопровождение WSDL-документов в стиле document/literal.
Ресурсы
- Исчерпывающие сведения об использовании в Web-сервисах стиля document/literal можно получить, прочитав статью Джеймса Маккарфи (James McCarthy) "Преимущества использования стиля document в Web-сервисах" (Reap the benefits of document style Web services, developerWorks, июнь 2002 г.) и статью Расселла Бутека (Russell Butek) "Какой стиль WSDL следует использовать" (Which style of WSDL should I use?, developerWorks, октябрь 2003г.).
- В статье Билала Сиддикуи (Bilal Siddiqui) "Развертывание Web-сервисов с WSDL" (Deploying Web services with WSDL, developerWorks, ноябрь 2001г.) рассматривается ранняя версия WSDL.
- Текущая версия спецификации "Язык описания Web сервисов, версия 1.2" (Web Services Description Language (WSDL) Version 1.2). Познакомится с будущей версией можно, прочитав "WSDL, версия 2.0, Часть 0. Основные понятия" (WSDL Version 2.0 Part 0: Primer).
- Учебное пособие Юча Огбуджи (Uche Ogbuji) "Разработка на Python/XML с помощью 4Suite, часть 4: композиция и обновления" (Develop Python/XML with 4Suite, Part 4: Composition and updates) посвящено XInclude и XPointer - в нем рассказывается о более раннем синтаксисе XInclude (октябрь 2002г.).
- Отличное введение в XInclude (более ранний синтаксис) - статья Эллиотта Расти Хэрольда (Elliotte Rusty Harold) "Использование XInclude" (Using XInclude).
- Учебные пособия на ресурсе ZVON - XInclude и XPointer. Они также посвящены более ранней версии XInclude.
- Наиболее подробная информации содержится в спецификациях "Включения XML (XInclude), версия 1.0" (XML Inclusions (XInclude) 1.0) и "Структура XPointer" (XPointer Framework), опубликованных на сайте консорциума W3C.
- Множество других статей, рубрик, учебных пособий и заметок в разделах Web services и XML рубрики developerWorks.
- На странице IBM Certified Developer in XML and related technologies приведена информация о том, как стать сертифицированным разработчиком XML.
Об авторе
|
Юч Огбуджи (Uche Ogbuji) - консультант и один из основателей Fourthought, компании, занимающейся поставками программного обеспечения и предоставлением консалтинговых услуг в области XML-решений для корпоративного управления знаниями. Fourthought разрабатывает 4Suite, платформу с открытым исходным кодом, для XML, RDF и приложений по управлению знаниями. Юч Огбуджи - инженер в области вычислительной техники, он родился в Нигерии, сейчас живет и работает в Боулдер-Сити (Boulder), штат Колорадо, США. С ним можно связаться по адресу uche.ogbuji@fourthought.com. |