Язык XML превратился сегодня в реальный инструмент построения систем B2B. Так, Северо-Западное таможенное управление осуществляет проект по организации системы обмена электронными документами между таможенными службами России и Финляндии. В данной статье разбираются некоторые особенности разработки этой системы, построенной на основе обмена XML-документами. В статье рассмотрены принципы построения подобных систем и структуры электронных сообщений, разобраны практические примеры.

Консорциум WWW Consortium (www.w3c.org) еще в феврале 1998 года рекомендовал использовать язык XML при организации систем электронного бизнеса. Эффективность такого подхода к построению B2B-систем основывается на четком и наглядном представлении структурированной информации, возможности использования современных сетевых протоколов при низких затратах на создание интерактивных бизнес-систем. Независимость представления информации в виде XML-документов позволяет разным разработчикам создавать компоненты системы автономно.

Во всех существующих B2B-системах обмен, как правило, строится по типовой схеме, с использованием http-запросов и протокола SSL.

Cо стороны одного торгового партнера в качестве клиентской программы выступает приложение, которое в режиме POST выдает http-запрос к Web-серверу второго партнера. На стороне сервера запрос обрабатывается, и соответствующее приложение готовит ответ и возвращает его через сервер клиентской программе. Обмен осуществляется в виде XML-документов. Подобный обмен называют осуществлением бизнес-транзакции.

Рассмотрим пример. Пусть Предприятие А запрашивает наличие продукции у Поставщика В (в этом случае Предприятие А и запущенная на его стороне программа выступает в качестве клиента). АСУ Склад (Поставщик В) располагает базой данных по складскому комплексу. Типовой алгоритм обмена выглядит следующим образом (см. рис. 1).

Рис. 1. Организация обмена в B2B-системах
  1. Предприятие А инициирует процесс А (заказ продукции), который выступает в качестве Web-клиента.
  2. Процесс А формирует XML-документ (например, запрос- накладная) и передает его как http-запрос POST на Web-сервер Поставщика В. В качестве URI используется идентификатор ресурса обрабатывающего приложения; этот идентификатор может быть либо одинаковым для всех типов документов, либо индивидуальным для каждого типа — все зависит от структуры B2B-сервера.
  3. Web-сервер анализирует запрос и порождает серверный процесс В, передавая в качестве параметра тело XML-документа. Процесс В запускается Web-сервером и обрабатывается как ASP-страница, CGI-приложение или Java-севрлет.
  4. Процесс В формирует запрос на SQL-сервер базы данных.
  5. SQL-сервер производит необходимые операции в базе данных, формирует ответ и возвращает его Процессу В.
  6. По ответу от SQL-сервера Процесс В формирует XML-документ и возвращает его в ответ на http-запрос клиентскому приложению.
  7. Далее, в зависимости от ситуации на стороне клиента формируется либо новый http-запрос, либо заканчивается сеанс.

Организация документооборота

При построении систем В2В центральное место занимает составление структуры электронных документов и карты сообщений. Целесообразно, чтобы каждый XML-документ, подобно HTML-документу, имел заголовок, в котором заключена общая информация о бизнес транзакции и тело сообщения, содержащее структурированную информацию. Для выделения заголовка рекомендуется использовать тег , для описания запроса — тег , а для ответа на запрос — тег ). Для того чтобы XML-документ был формально правильно построен, необходимо его две составные части «Заголовок» и «Запрос» обрамить тегами, скажем, . Примерный вид типового электронного документа:



... данные заголовка


... основные данные
или тело электронного документа

В отличие от типового HTML-документа заголовок должен содержать разного рода служебную информацию, в том числе о типе передаваемого документа и процессе его обработки. В обработку поступает лишь тело документа — содержательная часть, обрамленная тегами .

При построении системы обмена электронными документами прежде всего разрабатывается схема потоков документов, их структура и информационное содержание, а уже затем — таблицы «функций процессов», которые определяют, какой процесс будет реализовывать конкретную функцию обработки по отношению к какому документу. Особое место занимает построение бизнес-модели всей системы электронного обмена. В статье «Создание единого глобального электронного рынка — проект ebXML» (www.citforum.ru//internet/articles/ebxml.shtm) этот процесс описан более полно.

Ключевую роль в обработке XML-документов занимает концепция объектной модели документа DOM (Document Object Model) [1].

Концепция DOM

Каждый XML-документ представляется в виде набора множества объектов (классов), с помощью которых возможен доступ к отдельным элементам (полям объекта). Над элементами классов можно производить некоторые действия, вызывая методы класса объекта. DOM-модель представляет собой дерево (рис. 2), в корне которого расположен единственный объект DOMDocument, имеющий ссылку на корневой элемент (узел) DOMNode.

Рис. 2. Представление XML-документа в терминах DOM-модели

Объект DOMNode, реализующий базовый DOM-интерфейс Node, предназначен для манипулирования с отдельным узлом дерева документа. Его свойства и методы позволяют получать и изменять полную информацию о текущем узле — его тип, название, полное название, его содержимое, список дочерних элементов и т.д.

Каждый узел представлен объектом XMLDOMNode и может иметь родительский узел, предшествующий и последующий узлы, дочерний узел. У корневого узла есть только последующие и/или дочерние узлы. Каждый узел имеет один из следующих типов:

элементNODE_ELEMENT = 1;
атрибутNODE_ATTRIBUTE = 2;
текстNODE_TEXT = 3;
секция данныхNODE_CDATA_SECTION = 4;
ссылка на единицу NODE_ENTITY_REFERENCE = 5;
единицаNODE_ENTITY = 6;
инструкцияNODE_PROCESSING_INSTRUCTION = 7;
комментарийNODE_COMMENT = 8;
документNODE_DOCUMENT = 9;
тип документаNODE_DOCUMENT_TYPE = 10;
фрагмент документаNODE_DOCUMENT_FRAGMENT = 11;
замечаниеNODE_NOTATION = 12.

В качестве примера на рис. 3 приведена DOM-модель элемента ООО Тайфун. Узел «Sender» имеет дочерний узел типа Text, содержащий данные «ООО Тайфун».

Рис. 3. DOM-представление узлов документа

Компанией Microsoft DOM-интерфейс реализован в виде COM-сервера msxml.dll, который включен в состав ОС Windows 98, а так же в состав браузера Internet Explorer. На сайте www.msdn.microsoft.com/ подробно изложены методы и свойства интерфейсных объектов и соклассов (CoDOMDocument, CoDOMFreeThreadedDocument, CoXMLHTTPRequest, CoXMLDSOControl, CoXMLDocument), инициализируемых XML-анализатором msxml. Наиболее интересен сокласс CoXMLDocument, который содержит следующие основные интерфейсы:

  • IXMLDOMNode (узел);
  • IXMLDOMNodeList (список узлов);
  • IXMLDOMDocument (документ);
  • IXMLDOMElement (элемент);
  • IXMLDOMAttribute (атрибут);
  • IXMLDOMDocumentFragment (фрагмент документа);
  • IXMLDOMText (текст);
  • IXMLDOMCharacterData (символьные данные);
  • IXMLDOMCDATASection (секция данных CDATA);
  • IXMLDOMParseError (ошибки разбора).

Данные интерфейсы представлены шире, чем базовые рекомендации DOM Core 1.0 консорциума W3C.

Создание клиентской части

Главная задача клиентской части — формирование сообщения и передача его по протоколу HTTP на Web-сервер бизнес-партнера. Суть использования DOM-интерфейса и организации бизнес-транзакций призвана проиллюстрировать пример формирования заголовка XML-сообщения клиентской программы (рис. 1).

Procedure
TThread1.HeaderCreate(Sender: Tobject);
Var
CoDoc : CoDomDocument;
Doc : DomDocument;
r : IXMLDOMElement;
Node : IXMLDOMElement; //
txt : IXMLDOMText;
attr : IXMLDOMAttribute;
begin
Doc := coDoc.Create; //создание
DOM-документа
Doc.Set_async(false); //установка синхронного
 режима обработки
Doc.LoadXML(??);
// инициация
DOM-документа
R := Doc.Get_documentElement; //получение
 адреса корневого элемента
Node := Doc.createElement ( ?Sender?);
Txt := Doc.createTextNode( ?ООО «Тайфун»?);
Node.appendChild(txt); //присвоение
 узлу 
 значение текстового узла ?ООО «Тайфун»?
r.appendChild(Node); //добавление
 элемента 
 в корень документа как дочернего
Node := Doc.createElement (?From?);
//аналогичные операции для тега 
Txt := Doc.createTextNode
 (?http://tayfun.ru/xml/default.asp?);
Node.appendChild(txt);
r.appendChild(Node);
Node := Doc.createElement (?To?);
//аналогичные операции для тега 
Txt := Doc.createTextNode (?http://irbis.ru?);
Node.appendChild(txt);
r.appendChild(Node);
Node := Doc.createElement (?TypeDocument?);
Att := Doc.createAttribute (?Id ?, ? Order?);
Node.appendChild(Att); //
r.appendChild(Node);
end;

Данная часть программы реализована в среде Delphi, однако выбор среды программирования принципиального значения не имеет. Главное, чтобы средой программирования поддерживалась COM-технология.

В представленном примере показано как инициализируется сокласс CoDomDocument, через который осуществляется доступ к интерфейсам IXMLDOMElement, IXMLDOMElement, IXMLDOMText, DOMText, IXMLDOMAttribute, DOMAttribute.

Объявление переменной со-класса coDoc : CoDomDocument и переменной Doc : DomDocument, а также ее создание методом Create (Doc := coDoc.Create;) осуществляется один раз, как правило, в процедуре обработки создания объекта приложения onCreate. Объявление должно находиться в секции описания глобальных переменных, чтоб был доступ из локальных процедур.

В результате выполнения данной подпрограммы для бизнес-транзакции будет сформирован заголовок:

 ООО?Тайфун» 
 http://tayfun.ru./xml/default.asp 
 http://irbis.ru 

В [2] можно найти пример формирования бизнес-транзакции «инвойс» из данных базы данных, находящихся на стороне клиента.

Основное преимущество организации бизнес-транзакций в XML-виде в том, что существует возможность формировать сообщение, используя независимые структуры таблиц реляционных СУБД как на принимаемой, так и на передаваемой стороне.

Cоздание серверной части

В отличие от клиентской части, на серверной части решается обратная задача — разбор принятого XML-сообщения. Приведенный пример обработки CGI-приложения иллюстрирует способ преобразования полученного XML-документа и его обработки. Рассмотрено также использование XSL-шаблона для анализа документа типа ORDER. Хотя http-запрос ASP-страницей обрабатывается эффективнее, чем CGI-приложением, существенной разницы, как это делать, нет. Гораздо важнее решить вопрос — как построить программу обработки. Выбор на использование CGI-приложения пал потому, что наиболее популярный в Рунете Web-сервер Apache не поддерживает технологию ASP.

procedure Tthread1.DataParser
(Sender: Tobject);
var
r,FNode : IXMLDOMElement;
//объявление объектов
DOMElement
Str,Filename : String;
parm : String;
CoDocXML, CoDocXSL, CoDocResult :
CoDomDocument;
XMLDoc, XSLDoc, ResultDoc : DomDocument;
Begin
XMLDoc := coDocXML.Create;
//создание документа XMLDoc
XMLDoc.Set_async(false);
//установка синхронного режима обработки
XMLDoc.LoadXML(HttpStr);
//загрузка DOM документа
из строки HttpStr
r := Doc.Get_documentElement;
//получение адреса
корневого элемента
FNode := r.SelectSingleNode(«//TypeDocument»);
//получение значения элемента 
FileName := FNode.GetAttibute(«id»);
//получение значения аттрибута id=«Order»
FileName := FileName+».xsl»;
//и формирование имени
файла Order.xsl
XSLDoc := coDocXSL.Create;
//создание документа XSLDoc
XSLDoc.Set_async(false);
//установка синхронного режима обрабработки
XSLDoc.LoadXML(FileName);
//загрузка DOM документа из файла Order.xsl
ResultDoc := coDocResult.Create;
//создание документа XMLDoc
ResultDoc.Set_async(false);
//установка синхронного режима обрабработки
ResultDoc.validateOnParse := true;
//установка проверки разбора
XMLDoc.transformNodeToObject(XSLDoc,
ResultDoc);
//разбор XMLDoc
по XSL-шаблону
Str:= ResultDoc.text;
//переменной Str присваивается текстовое
 значение результирующего документа.
FNode := r.SelectSingleNode(«//InvoiceNumber»);
//поиск элемента

parm := FNode.text; //и получение значения
 элемента
Query.Close; //закрывает запрос для доступа
Query.Text := Str;
Query.Params[0].AsString := parm;
//присваивание значения
параметра
Query.ExecSQL; //выполнение запроса
end;

В результате выполнения программы, после разбора XML-данных XSL-шаблоном формируется строка Str на выполнение SQL-запроса на ввод данных в таблицы СУБД сервера партнера Invoice_General и GOODS.

Преимущество использования разбора через шаблон состоит в том, что достигается гибкость и независимость данных от программного кода, а также от типа используемых СУБД. Другим преимуществом использования XSL-шаблона является возможность применения имен полей таблиц баз данных, независимых от имен элементов данных XML-документа. Эта возможность отсутствует в таких СУБД, как Oracle 8 или Microsoft SQL Server 2000, имеющих поддержку XML. Иными словами, при использовании СУБД, интегрированных с XML, имя элемента данных XML-документа должно строго совпадать с именем поля данных таблицы.

Для обработки приведенного XML-документа используется следующий текст XSL-шаблона:








INSERT into Invoice_General (Destination,
 Consignee, Departure,DataDispatch) VALUES( ?
? ,?
 ?,
 ?? ,??)




INSERT into GOODS ( invoiceNumber,
 name, price, quality) VALUES( ? :num?,
?? ,
 ??, ? ? )



Использование пары тегов и носит формальный характер: после разбора в результирующем XML-документе формально должен присутствовать хотя бы один узел. Такую роль играет пара и . Метод ResultDoc.text присваивает текстовое значение полученного в ходе разбора XML-документа ResultDoc. В этом случае значением является все то, что обрамлено данной парой и (т.е. сформированный SQL-запрос).

Другой особенностью программы надо отметить возможность использования SQL-параметра :num, позволяющего упростить текст xsl-шаблона. Определение значения соответствующих элементов узлов XML-документа первоначально определяется выбором имени соответствующего узла:

FNode:= r.SelectSingleNode(«//InvoiceNumber»);
 // поиск элемента 

и далее использование свойства text:

parm:= FNode.text; //и получение
 значения элемента

Заключение

В статье, не претендующей на полноту изложения методов разбора и создания XML-документов, приведены два примера: создание XML-документа для клиентской части систем электронного бизнеса и разбор XML-документов с использованием XSL-шаблонов для серверной части таких систем. Акцент сделан на использование объектной модели документа DOM, хотя существует практика обработки XML-документов и как обычных текстовых файлов. В случае больших текстов последний подход оказывается более эффективным. Использование концепции DOM позволяет доступно и наглядно описать работу с XML-документами, перестроить программу и упростить ее отладку.

Используемый автором популярный XML-анализатор msxml.dll является не единственным и из-за своих широких возможностей проигрывает в скорости разбора объемных документов другим анализаторам: Sablotron 0.52 (www.gingerall.com/), Saxon 6.2.2 (www.users.iclway.co.uk/mhkay/saxon/), Xalan 1.2 (xml.apache.org/xerces-j/index.html). Помимо использования концепции DOM при создании системы можно опираться на API-интерфейс SAX (Simple API for XML) группы XML-DEV, ориентированный на модель обработки событий.

Литература

[1] Ф. Бумфрей, О. Диренцо и др. XML — новые перспективы WWW. М.: Wrox, 2000

[2] А.М. Календарев. «Использование XML в среде Delphi». http://www.eDocs.al.ru/ xml/Delphi_XML.html

Александр Календарев (akalend@mail.ru) — сотрудник Северо-Западного таможенного управления (Санкт-Петербург).


Коротко об XSL

Язык форматирования таблиц стилей eXtensible Stylesheet Language (XSL), используется для форматирования XML-данных и по определению W3C состоит из двух частей.

  • XSLT (XSL Transformation). Язык, используемый для преобразования или форматирования (трансформирования) XML-документов. При помощи XSLT можно получить разные разрезы множества данных и формы представления данных.
  • Элементы форматирования. К ним относятся все элементы типографического оформления данных, после их обработки при помощи XSL. Используется только для формирования HTML-страниц.

При помощи XSLT можно отобрать только необходимые данные из всего XML-файла и оформить их в виде, необходимом для предоставления пользователю. Например, в рассмотренном примере XML-данные преобразовали в вид SQL-запроса.

Классическое применение XSL — это форматирование данных в виде HTML-страниц или более редкое представление в виде RTF-файлов. XSL-файл описывает шаблон (template), согласно которому будет совершаться преобразование XML-данных.

Более подробную информацию об XSLT можно на официальном сайте консорциума W3C или на рускоязычном сайте XML/XSL (www.bim.f2s.com), который реализован путем трансформации XML в HTML с использованием XSL-шаблонов.