Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Конференция «Технологии управления данными 2018»
СУБД, платформы, инструменты, реальные проекты.
29 ноября 2018 г.
2004 г.

Использование XInclude для синхронизации WSDL с исходными схемами

Юч Огбуджи (Uche Ogbuji)
Перевод Intersoft Lab

Импорт формата полезной нагрузки в случае использования описаний сообщений document/literal

При использовании в Web-сервисе стиля document/literal схемы форматов обмена данными часто опираются на существующий стандарт документа. Это может вызвать проблемы с синхронизацией WSDL-файлов со стандартными схемами. В этой статье показано, как использовать XInclude, чтобы включить в WSDL-файл фрагменты внешней схемы.

Для того, чтобы формализовать 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.
Оригинальный текст статьи можно посмотреть здесь:
Use XInclude to synchronize WSDL with source schemata

Новости мира IT:

Архив новостей

Последние комментарии:

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 985 1945361
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2015 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...