Начнем с
начала, с xml документов, прежде всего любой xml документ начинается с объявления, есть три
свойства которые вы можете встретить в объявлении, это: version, encoding, standalone. Version
устанавливает номер версии xml, на данный момент мне известна только
одна версия “1.0”, encoding – кодировка в которой сохранен файл, standalone - когда xml документ, обрабатывают сторонние “редакторы-обработчики”,
то это свойство подсказывает если ли у документа другие части которые должны
быть подгружены, для того что бы иметь целостный xml документ для обработки. Если
атрибут standalone равен значению yes, то xml файл состоит из одной части – тела файла, если no, то должны
быть еще какие-то части документа, которые нам нужно подгрузить. Пример:
<?xml
version="1.0" encoding="UTF-8" standalone=”yes” ?>
XML документ
состоит из элементов, ещё их называют тегами, у тегов могут быть атрибуты, каждый
файл имеет корневой тег. Каждый тег, должен открываться начальным тегом и
заканчиваться конечным, между ними находится значение тега. Комментарии в файле,
не несут ни какой смысловой нагрузки, теги и атрибуты регистро зависимые, то есть если вы используете в начальном теге верхний
регистр символов, то и конечный тег должен совпадать по регистру. Значение
атрибутов всегда должны быть заключены в кавычки. Важную роль играет понятие пространство имен (namespace), помогает
избежать конфликта имен в тегах, если в
документе могут встретиться одинаковые теги, но разные по логике применения. Описание пространства имен происходит посредством
атрибута xmlns:имя_простраства_имен=”URI”. Имя_простраства_имен может быть
произвольным, URI – универсальный идентификатор ресурса,
это строка символов, которая уникальным образом должна идентифицировать
пространство имен, обычно многие пространства имен имеют URL, который указывает на документ в
сети интернет. Когда мы ввели в наш xml документ пространство имен,
мы к тегам которые находятся в этом
пространстве имен, должны добавлять префикс имя_простраства_имен и через знак “:”
название тега - <имя_простраства_имен:имя_тега>.
Для того что бы, не добавлять постоянно этот префикс, можно объявить
пространство имен по умолчанию, происходит это посредством атрибута xmlns =”URI”, просто
уже нет объявления имя_простраства_имен. Посмотрите на кусок xml документа, желтым цветом помечены фрагменты кода, которые приводятся для
закрепления теории которую я описал выше:
<?xml
version='1.0' encoding='UTF-8'?>
<wsdl:definitions
name="OrderProcessService"
targetNamespace="http://order.demo/" xmlns:ns1="http://schemas.xmlsoap.org/soap/http"
xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://order.demo/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<wsdl:types>
<xs:schema
attributeFormDefault="unqualified"
elementFormDefault="unqualified"
targetNamespace="http://order.demo/"
xmlns:tns="http://order.demo/" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element
name="processOrder" type="tns:processOrder" />
<xs:element
name="processOrderResponse" type="tns:processOrderResponse"
/>
<xs:complexType
name="processOrder">
<xs:sequence> <!--
это коментарий -->
<xs:element
minOccurs="0" name="arg0" type="tns:order" />
</xs:sequence>
</xs:complexType>
<xs:complexType
name="order">
<xs:sequence>
<xs:element
minOccurs="0" name="customerID" type="xs:string"
/>
<xs:element
minOccurs="0" name="itemID" type="xs:string"
/>
<xs:element
name="price" type="xs:double" />
<xs:element
name="qty" type="xs:int" />
</xs:sequence>
</xs:complexType>
<xs:complexType
name="processOrderResponse">
<xs:sequence>
<xs:element
minOccurs="0" name="return" type="xs:string"
/>
</xs:sequence>
</xs:complexType>
</xs:schema>
</wsdl:types>
….
</wsdl:definitions>
Когда мы обмениваемся
xml документами, для нас
важно что бы отправитель и получатель
документа имели одинаковые “ожидания” от содержимого, одинаково могли
интерпретировать документ, его значения. С помощью xml схем
создатель документа может описать как должен, обрабатываться, какие типы данных
использовать при обработке, что очень облегчает жизнь клиенту, когда он
работает с документом. Для примера,
разделитель дробной части в разных странах разный у кого точка, у кого
запятая, значения даты по-разному, могут интерпретироваться в разных странах,
точнее их позиции, а если у нас есть типы данных элементов, то мы вряд ли
ошибемся с интерпретацией xml документа. Если вернутся к нашему
примеру тег <xs:schema … задает схему,
где мы можем описать типы данных нашего документа. Простые элементы
определяются так <xs:element
name="имя" type="тип данных"
/>, например <xs:element
name="qty" type="xs:int" /> сложные элементы составляются из простых элементов так:
<xs:complexType name="имя">
<xs:sequence>
….
<xs:element
name="имя" type="тип данных" />
</xs:sequence>
</xs:complexType>
Пример
сложного элемента можете посмотреть опять же в предыдущем примере. Простые
элементы, используют встроенные типы, приведу наиболее часто встречающиеся из
них: xs:string, xs:int, xs:double, xs:date, xs:boolean. Важно, на значения типов элементов можно накладывать ограничения, которые
придают новые свойства простым типам. Например, нам нужно ограничить простой тип
xs:int минимальным значением от 16 и старше.
Это делается при помощи служебного тега <xs:restriction>:
<xs:element name=’age’>
<xs:simpletype>
<xs:restriction
base=’xs:int’>
<xs:minInclusive
value=’16’/>
</xs:restriction>
</xs:simpletype>
</xs:element>
Next