XML - статьи

Инъекция включением


Конструкция 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>



Содержание раздела