12.23.2015

Web Service - XML теория, что нужно знать …



Начнем с начала, с 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>

Для того что бы хорошо разбираться в web сервисах, нужно хорошо оперировать с xml  файлами, нужно очень хорошо знать, что такое xml файл и что такое схема xml  документа.
Next

Комментариев нет:

Отправить комментарий