Язык XML превратился сегодня в реальный инструмент построения систем B2B. Так, Северо-Западное таможенное управление осуществляет проект по организации системы обмена электронными документами между таможенными службами России и Финляндии. В данной статье разбираются некоторые особенности разработки этой системы, построенной на основе обмена XML-документами. В статье рассмотрены принципы построения подобных систем и структуры электронных сообщений, разобраны практические примеры.
Консорциум WWW Consortium (www.w3c.org) еще в феврале 1998 года рекомендовал использовать язык XML при организации систем электронного бизнеса. Эффективность такого подхода к построению B2B-систем основывается на четком и наглядном представлении структурированной информации, возможности использования современных сетевых протоколов при низких затратах на создание интерактивных бизнес-систем. Независимость представления информации в виде XML-документов позволяет разным разработчикам создавать компоненты системы автономно.
Во всех существующих B2B-системах обмен, как правило, строится по типовой схеме, с использованием http-запросов и протокола SSL.
Cо стороны одного торгового партнера в качестве клиентской программы выступает приложение, которое в режиме POST выдает http-запрос к Web-серверу второго партнера. На стороне сервера запрос обрабатывается, и соответствующее приложение готовит ответ и возвращает его через сервер клиентской программе. Обмен осуществляется в виде XML-документов. Подобный обмен называют осуществлением бизнес-транзакции.
Рассмотрим пример. Пусть Предприятие А запрашивает наличие продукции у Поставщика В (в этом случае Предприятие А и запущенная на его стороне программа выступает в качестве клиента). АСУ Склад (Поставщик В) располагает базой данных по складскому комплексу. Типовой алгоритм обмена выглядит следующим образом (см. рис. 1).
Рис. 1. Организация обмена в B2B-системах |
- Предприятие А инициирует процесс А (заказ продукции), который выступает в качестве Web-клиента.
- Процесс А формирует XML-документ (например, запрос- накладная) и передает его как http-запрос POST на Web-сервер Поставщика В. В качестве URI используется идентификатор ресурса обрабатывающего приложения; этот идентификатор может быть либо одинаковым для всех типов документов, либо индивидуальным для каждого типа — все зависит от структуры B2B-сервера.
- Web-сервер анализирует запрос и порождает серверный процесс В, передавая в качестве параметра тело XML-документа. Процесс В запускается Web-сервером и обрабатывается как ASP-страница, CGI-приложение или Java-севрлет.
- Процесс В формирует запрос на SQL-сервер базы данных.
- SQL-сервер производит необходимые операции в базе данных, формирует ответ и возвращает его Процессу В.
- По ответу от SQL-сервера Процесс В формирует XML-документ и возвращает его в ответ на http-запрос клиентскому приложению.
- Далее, в зависимости от ситуации на стороне клиента формируется либо новый 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-шаблонов.