Технологическая спецификация шлюза с учетными системами банка
Система «Частный Клиент»
Технологическая спецификация шлюза с учетными системами банка
Оглавление
1. Введение.. 2
2. Архитектура шлюза.. 2
3. Составные части шлюза.. 3
3.1. Интерфейс.. 3
3.2. Маршрутизатор. 4
3.2.1. Назначение и схема работы.. 4
3.2.2. Система разбора поступающих запросов. 4
3.2.3. Система конфигурирования. 6
3.2.4. Система ведения логов. 8
3.3. Модули связок.. 9
3.3.1. Назначение и схема работы.. 9
3.3.2. Логический модуль. 10
3.3.3. Принципы разработки новых модулей связок. 10
1. Введение
Данный документ описывает архитектуру, функциональные требования, интерфейсы и особенности реализации подсистемы «Шлюз с учетными системами банка» системы «Частный Клиент».
В документе приняты следующие сокращения:
ДБО | серверная часть системы «Частный Клиент» |
ЧК | система «Частный Клиент» |
ЭЦП | электронная цифровая подпись |
ИК | подсистема «Интернет-Клиент» системы «Частный Клиент» |
Шлюз | подсистема «Шлюз с учетными системами банка» системы «Частный Клиент» |
УС | учетная система банка |
Основные функции шлюза:
- Прием запросов других подсистем ДБО; Маршрутизация запросов в нужную УС; Исполнение запроса – обмен информацией с УС; Формирование ответа и передача его в подсистему ДБО, сформировавшую запрос.
Работа шлюза должна удовлетворять следующим требованиям:
- Многопоточная обработка поступающих запросов; Немедленная их передачу в УС (работа в «онлайн»); Как можно более быстрый обмен информацией с УС и выдача ответа (быстродействие должно определятся только временем реакции УС); Работа в режиме 24x7.
2. Архитектура шлюза

Рисунок 1. Принципиальная схема взаимодействия шлюза с другими подсистемами и с учетными системами банка.
Шлюз состоит из следующих подсистем:
- Интерфейс – интерфейс шлюза для других подсистем ЧК. На него передается запрос в XML-формате, и после его обработки и получения информации из УС выдается ответ.
- Маршрутизатор – осуществляет выбор модуля связки, в который необходимо передать запрос.
- Модули связок с УС банка – осуществляют преобразование данных из XML-формата в формат УС и обратно, а также непосредственно взаимодействуют с УС.
3. Составные части шлюза
3.1. Интерфейс
Интерфейс шлюза представляет из себя ряд процедуру:
Procedure RetABS ( InXML: string; var OutXML: string);(бибилиотека axABSLnk. bll)
InXML – входящий запрос на обмен данными с УС (например, получение какой-либо информации или выгрузка);
OutXML – ответ, полученный от УС (включает в себя служебную информацию – например сообщение об ошибке).
У нее существует ряд функциональных аналогов:
function RetABSEx(oInXML:object; oOutXML:object):string;
oInXML – входящий запрос, указатель на DCOM объект XML DOM Document
oOutXML – ответ на запрос, указатель на DCOM объект XML DOM Document
Функция возвращает непустой текст ошибки, если в ответ на запрос не удалось записать xml-структуру ответа (т. е. если oOutXML. xml=''). Иначе результат – пустая строка, а в oOutXML записан ответ на запрос.
procedure RetABSMixed(sInXML:string; oOutXML:Object);
аналогична процедуре RetABS, только на вход подается переменная oOutXML – указатель на DCOM объект XML DOM Document, в который будет записан овет на запрос.
3.2. Маршрутизатор
3.2.1. Назначение и схема работы
Основная задача маршрутизатора – перенаправление запроса в соответствующий модуль связки. Выбор модуля осуществляется при помощи системы конфигурирования.

Рисунок 2. Схема устройства маршрутизатора.
3.2.2. Система разбора поступающих запросов

Рисунок 3. Блок-схема работы маршрутизатора.
Поступающие в маршрутизатор запросы разбираются по следующей схеме:
1. Разбирается входящий XML. В случае ошибки разбора возвращается ошибка BS_ERROR_PARSE_XML='BS:1';
2. Определяется тип запроса по namespaceURI входящего XML;
3. Проверяется структуры входящего XML на соответствие XSD. Для этого загружается XSD для проверки, соответствующая типу из каталога, заданного в настройке XSDPath (см. п. 3.2.3.1 «Настроечные параметры»). В случае ошибки проверки по XSD возвращается ошибка BS_ERROR_XML_STRUCTURE='BS:2';
4. Выбирается библиотека обработчика запроса по следующему алгоритму:
a. По параметру запроса BranchID определяется филиал клиента.
b. В таблице маршрутизации IFIZREQMAP находиться запись с полями RequestType и ABSBranchID соответствующими типу запроса и филиалу клиента и определяется тип УС (поле ABSTypeID).
c. Если не найдено значение для указанного номера филиала, то поиск идёт по типу запроса и пустому значению номера филиала.
d. Если и в этом случает, запись не найдена – тип УС определяется из настройки DefaultABSType;
e. По типу УС и типу запроса из справочника запросов IFIZABSLIB определяется логический модуль - библиотека обработчика запроса;
5. Запрос передается в логический модуль.
Заполнение номера филиала в запросах добавляться при включенной настройке Построителя MultiFilialBank (Структуры -> Конфигурации -> IFIZ -> MultiFilialBank). Если банк не поддерживает мультифилиальность, то настройка MultiFilialBank должна быть отключена и в запросах BS_R номер филиала не указывается и маршрутизация выполняется только по типу запроса.
3.2.3. Система конфигурирования
3.2.3.1. Настроечные параметры
Здесь приводится описание настроечных параметров, необходимых для работы системы конфигурирования маршрутизатора.
3.2.3.1.1. XmlParserDCOMName
14-IFIZ: XML. ParserDCOMName: string (default 'MSXML2.DOMDocument.4.0')
Название DCOM объекта, предоставляющий интерфейс к XML DOM Document. С помощью этого интерфейса производиться разбор XML.
3.2.3.1.2. XmlCacheDCOMName
14-IFIZ: XML. CacheDCOMName: string (default 'Msxml2.XMLSchemaCache.4.0')
Название DCOM объекта, предоставляющий интерфейс к XML Schema Cache. С помощью этого интерфейса производиться проверка соответствия XML XSD.
3.2.3.1.3. XSDPath
14-IFIZ: XML. XSDPath: string (default ' %BSSRoot%\Subsys\xsd\')
Каталог, в котором находятся XSD для проверки XML.
3.2.3.1.4. DefaultABSType
14-IFIZ: DefaultABSType: integer (default 1)
Задает тип АБС по умолчанию, которая обрабатывает запросы.
3.2.3.1.5. IsCheckOutXML
14-IFIZ: IsCheckOutXML: boolean (default true)
Настройка задает, проверять ли ответные XML, пришедшие от логического модуля обработки запроса, на соответствие XSD.
3.2.3.1.6. ReturnErrorOnInvalidOutXML
14-IFIZ: ReturnErrorOnInvalidOutXML: boolean (default true)
Настройка задает, считать ли ответные XML, не прошедшие проверку на соответствие XSD, корректными. Если true, то ответный XML, пришедший от логического модуля обработки запроса, будет заменен на стандартный ответный XML с описанием ошибки несоответсвия XSD. Иначе ответный XML будет выдан без изменений наружу.
3.2.3.1.7. Debug
14-IFIZ: ABSAPI. Debug: boolean (default false)
При включенной настройке шлюз и логические модули будут в лог писать отладочные сообщения
3.2.3.1.8. MultiFilialBank
14-IFIZ: MultiFilialBank: boolean (default false)
При включенной настройке шлюз, маршрутизация будет осуществляться с учетом многофилиальности.
3.2.3.2. Структуры таблиц

Рисунок 4. Структура таблиц конфигуратора.
3.2.3.2.1. Справочник УС (таблица IFIZABSTYPE)
Данная таблица содержит список всех поддерживаемых УС.
Поле | Тип | Комментарий |
ABSTypeID | Integer | Тип УС |
Description | String (255) | Описание УС |
Индексы | ||
ABSTypeID | Первичный |
3.2.3.2.2. Справочник типов запросов (таблица IFIZREQTYPE)
Данная таблица содержит список всех существующих видов запросов.
Поле | Тип | Комментарий |
RequestType | String (40) | Тип запроса |
AnswerType | String (40) | Тип ответа на запрос |
Description | String (255) | Описание запроса |
Индексы | ||
ABSTypeID | Первичный |
3.2.3.2.3. Справочник логических модулей (таблица IFIZABSLIB)
В данная таблице для каждой пары запрос – тип УС (для всех поддерживаемых комбинаций) сопоставлен логический модуль (библиотека bll).
Поле | Тип | Комментарий |
ABSTypeID | Integer | Тип УС |
RequestType | String (40) | Тип запроса (например, BS_R_ACCACC) |
LibName | String (20) | Логический модуль - библиотека обработчика запроса |
Description | String (255) | Описание библиотеки |
Индексы | ||
ABSTypeID – RequestType | Первичный |
3.2.3.2.4. Таблица маршрутизации (таблица IFIZREQMAP)
В данной таблице содержится указание на то в какую УС нужно маршрутизировать запрос в текущей конфигурации системы. Если для какого-то запроса не находится прямое указание УС – используется настройка DefaultABSType.
Поле | Тип | Комментарий |
RequestType | String (40) | Тип запроса (например, BS_R_ACCACC) |
ABSTypeID | Integer | Тип УС, обрабатывающая данный запрос |
ABSBranchID | String (15) | Идентификатор филиала во внешней системе |
Индексы | ||
RequestType | Первичный |
3.2.4. Система ведения логов
Шлюз осуществляет ведение логов по двухуровневой схеме:
- Общий лог для критических запросов; Отдельные логи по видам запросов.
Физически общий лог хранится в каталоге \SUBSYS\Logs\RetABS, а логи отдельных видов запросов – подкаталогах вида \BS_R_xxx. Имя файла лога составляется стандартным способом именования логов: текущая дата плюс расширение “log”.
Система настройки степени подробности логов по отдельным запросам осуществляется стандартным механизмом трассировки (через настройки дерева трассировки TraceOptions(14)). Для этого для каждого типа запроса добавляется ветка в дерево трассировки TraceOptions(14) с именем, совпадающим с именем типа запроса (например, BS_R_ACCACC – трассировка переводов со счета на счет клисента). А для общего лога - ветка RetABS.
Детализация ведения логов в зависимости от уровня ошибки для разных подсистем шлюза осуществляется по следующим принципам:
Уровень | Маршрутизатор | Модуль связки |
0 - выключен | Лог не ведется | Лог не ведется |
1 – крит. ошибка | Только критические ошибки: ошибочные запросы, отсутсвующие структуры данных, подсистемы и т. п. | Только критические ошибки: ошибочные запросы, ошибки работы с УС и т. п. |
2 – некрит. ошибка | Логируется факт отправки запроса в подсистему и получение ответа (указыватся заголовок запроса/ответа – BSMessage и BSHead, а также модуль связки в который был направлен запрос), также логируются некритические ошибки | Логируются факты общения с УС (указыватся ID запроса, наименование интерфейсной функции УС), также логируются некритические ошибки |
3 – журнализация | Логируется полное содержание запросов и ответов на запрос | Логируется ID запроса и полное содержание вызова интерфейсной функции УС и ее ответа |
4 - трассировка | Дополнительная отладочная информация | Дополнительная отладочная информация |
3.2.4.1. Библиотека ведения логов (lxLog. bll)
Для ведения логов необходимо использовать библиотеку lxLog. bll, в которую вынесены следующие процедуры
procedure TraceLog(LogDir:string;level:integer;ModuleName, ProcedureName, Mess:string);
Процедура записывает сообщение в лог слота LogDir.
LogDir – слот (ветка TraceOptions(14).eif) для вывода сообщения в лог
level – уровень сообщения; допустимы константы: erError=1(крит. ошибка); erLog=2(некрит. ошибка); erTrace=3(журнализация); erDebug=4(трассировка) и выше.
ModuleName – имя модуля
ProcedureName – имя процедуры модуля
Mess – сообщение
procedure ErrorLog(LogDir:string;ModuleName, ProcedureName, sShortMsg, sLongMsg:string);
Процедура записывает ошибку в error.log и в лог слота LogDir (если включено).
LogDir – слот (ветка TraceOptions(14).eif) для вывода сообщения в лог
ModuleName – имя модуля
ProcedureName – имя процедуры модуля
sShortMsg – короткое описание ошибки
sLongMsg - подробное описание ошибки
3.3. Модули связок
3.3.1. Назначение и схема работы
Модуль связки с отдельной УС состоит из следующих подсистем:
§ Низкоуровневый интерфейс с УС – обеспечивает базовые функции ввода/вывода информации из УС в ее формате;
§ Группа логических модулей по обработке запросов – каждый модуль обрабатывает отдельный вид запроса к УС, а также все его версии, специфичные для данной УС.

Рисунок 5. Архитектура модуля связки для отдельной УС.
Алгоритм работы логического модуля:
1. Разбор заголовка, в т. ч. проверка типа и версии запроса – если такой запрос не поддерживается, то обработка прекращается с сообщением об ошибке;
2. Разбор параметров запроса, сбор дополнительной информации (запрос справочников, констант и т. п. – с учетом версии запроса);
3. Формирование (с учетом версии запроса) и передача собранной информации в УС через низкоуровневый интерфейс;
4. Ожидание и обработка ответа от УС;
5. Преобразование ответа в XML-формат, выдача ответа в маршрутизатор.
3.3.2. Логический модуль
3.3.2.1. Интерфейс
Интерфейс логического модуля должен предоставлять две функции
function ProcessRequest(oInXML:object; oOutXML:object):boolean;
это функция обработки запроса, где
oInXML – входящий запрос, указатель на DCOM объект XML DOM Document
oOutXML – ответ на запрос, указатель на DCOM объект XML DOM Document
function GetLastError:string;
эта функция возвращает текст ошибки обработки запроса. Обычно используется в случае, если логический модуль не сформировал xml-структуру ответа в oOutXML (т. е. oOutXML. xml=’’).
3.3.3. Принципы разработки новых модулей связок
Для разработки нового модуля связки необходимо реализовать интерфейс логичекого модуля, описанного выше. Для упрощения реализации этого интерфейса следует использовать стандартные бибилиотеки lxABSLnk. bls (процедуры работы с xml) , lxLog. bls (ведение логов), lxTypCon. bls (конвертация типов данных при работе с xml). Описание интерфейса этих модулей ниже.
3.3.3.1. Модуль lxABSLnk. bls
Из этого модуля наиболее полезными для логического модуля связки являются процедуры CreateAnswerStructure, SetErrorOutXML. Остальные процедуры используются маршрутизатором.
3.3.3.1.1. function CreateXMLDOMObj:pointer;
Процедура создает XML COM-объект XmlParserDCOMName
Логическим модулем связки обычно не используется.
3.3.3.1.2. function CreateXMLCacheObj:pointer;
Процедур создает XML COM-объект XmlCacheDCOMName
Логическим модулем связки обычно не используется.
3.3.3.1.3. procedure OpenCache;
Процедур создает кэш для работы проверки XML -структур на соответсвие XSD.
Логическим модулем связки обычно не используется.
3.3.3.1.4. procedure CloseCache;
Процедура закрывает кэш.
Логическим модулем связки обычно не используется.
3.3.3.1.5. procedure LoadXMLWithPI(
oXML:object;
sXML:string);
Процедура загружает в oXML (объект типа XmlParserDCOMName) XML из строки sXML и задает кодировку и версию XML: version="1.0" encoding="windows-1251"
Логическим модулем связки обычно не используется.
3.3.3.1.6. function CreateXML(
CallProc:string;
sXML:string;
var ErrorCode:integer;
var ErrorString:string):pointer;
Функция создает и возвращает XML COM-объект XmlParserDCOMName по тексту XML: CallProc - процедура, из которой создается xml;
sXML - текст xml; ErrorCode - ошибка парсинга;
ErrorString - сообщение об ошибке парсинга
Логическим модулем связки обычно не используется.
3.3.3.1.7. function CreateXMLWithPI (
CallProc:string;
sXML:string;
var ErrorCode:integer;
var ErrorString:string):pointer;
То же что и function CreateXML, но еще задается кодировка и версия XML: version="1.0" encoding="windows-1251"
Логическим модулем связки обычно не используется.
3.3.3.1.8. function LoadXSD(oXSD:object; sPath:string):boolean;
Загружает в объект oXSD (объект типа XmlParserDCOMName) XSD для проверки XML, описание которого задано в файле sPath.
Логическим модулем связки обычно не используется.
3.3.3.1.9. function CheckXML(oXML:object; var ErrorString:string):boolean;
Проверка XML oXML (объект типа XmlParserDCOMName) на XSD.
Логическим модулем связки обычно не используется.
3.3.3.1.10. function CreateAnswerStructure(
oInXML:object;
XML_Version:string;
BS_A_TYPE:string;
OutSysID:string;
CustomerID:string;
oOutXML:object;
var ErrorCode:integer;
var ErrorString:string):boolean;
Создает структуру XML-ответа в oOutXML (объект типа XmlParserDCOMName) по входящему запросу oInXML (объект типа XmlParserDCOMName):
XML_Version – версия ответа
BS_A_TYPE – тип ответа
OutSysID – идентификатор внешней Учетной Системы
CustomerID – идентификатор ДБО клиента (если пусто, то берется из входящего запроса oInXML)
ErrorCode – код ошибки
ErrorString – текст ошибки
3.3.3.1.11. procedure SetErrorOutXML(
oOutXML:object;
ErrorCode:string;
ErrorMessage:string;
ABSMessage:string);
Заполняет в ответном XML oOutXML ошибку и текст обработки зароса во внешней УС
3.3.3.1.12. procedure GetErrorOutXML(
oOutXML:object;
var ErrorCode:string;
var ErrorMessage:string;
var ABSMessage:string);
По ответному XML oOutXML возвращает ошибку и текст обработки зароса во внешней УС
3.3.3.2. Модуль lxLog. bls
3.3.3.2.1. Константы уровеня трассировки
Модуль содержит константы, задающие уровень трассировки
erError=1 – критические ошибки;
erLog=2 – некритичекие ошибки и сообщения;
erTrace=3 – детальная журнаолизация;
erDebug=4 – отладочные сообщения;
3.3.3.2.2. procedure TraceLog(LogDir:string;level:integer;ModuleName, ProcedureName, Mess:string);
Вывод сообщения в лог
LogDir – слот лога
Level – уровень трассировочного сообщения
ModuleName – имя модуля
ProcedureName – имя процедуры
Mess - сообщение
3.3.3.2.3. procedure ErrorLog(LogDir:string;ModuleName, ProcedureName, sShortMsg, sLongMsg:string);
Вывод критичекой ошибки
LogDir – слот лога
ModuleName – имя модуля
ProcedureName – имя процедуры
sShortMsg – короткое сообщение (заголовок)
sLongMsg – детализация сообщения
3.3.3.2.4. function GetQueryError(qQuery:object):string;
Выдает строку SQL-запроса и его парметров (необходимо для отладочных сообщений).
3.3.3.3. Модуль lxTypCon. bls
3.3.3.3.1. function DateTimeToXML(aDateTime:datetime):string;
Конвертация даты-время в строку XML.
3.3.3.3.2. function XMLToDateTime(sDateTime:string):datetime;
Конвердация XML-строки с датой-временем в дату-время.
3.3.3.3.3. function CurrCodeToISO(CurrCode:string):string;
Перевод цифрового кода валюты в буквенный.
3.3.3.3.4. function MoneyToXML(aMoney:double):string;
Конвертация типа money в XML-строку.
3.3.3.3.5. function XMLToMoney(sMonye:string):double;
Конвертация XML-строки в money.
3.3.3.3.6. function DateToXML(aDate:datetime):string;
Конвертация даты в XML-строку.
3.3.3.3.7. function XMLToDate(sDate:string):date;
Конвертация XML-строки в дату.
3.3.3.4. Примеря структуры кода логичекого модуля связки
Exports
GetLastError,
ProcessRequest;
include
llSystem, llTypCon, …;
Uses
lxConst, lxLog, lxTypCon, lxABSLnk, …;
const
Module='axInvAcA';// имя текущего модуля
LogDir='BS_R_ACCACC'; // слот лога
cSysID='InvoRetail'; // идентификатор внешней Учетной Системы
BS_A_TYPE='BS_A_ACCACC'; // тип ответа на обрабатываемый запрос
var
Fmt:object;
LastErrorMessage:string;
procedure ClearError;
begin
LastErrorMessage:='';
end;
procedure SetError(vError:string);
begin
LastErrorMessage:=vError;
end;
function GetLastError:string;
begin
Result:=LastErrorMessage;
end;
// проверка бизнес-данных входного XML
function CheckInXML(
oInXML:object;
oOutXML:object
):boolean;
var
sVersion:string;
begin
sVersion:='';
if oInXML. DocumentElement. GetAttribute('Version')<>Null then
sVersion:=oInXML. DocumentElement. GetAttribute('Version');
Result:=(sVersion==XML_Version_STD10);
if Not Result then
SetErrorOutXML(oOutXML, BS_ERROR_INVALID_VERSION,'Invalid request version '+sVersion,'');
end;
procedure ProccessMyFunction(
oInXML :object;
oOutXML :object
);
begin
Proc:='ProccessMyFunction';
TraceLog(LogDir, erTrace, Module, Proc,'Start');
// данные из BSHead
oNode:=oInXML. DocumentElement. SelectSingleNode('//BSHead');
Val(oNode. GetAttribute('CustomerID'),CustID);
p_cus:=GetABSCustID(CustID);
// данные из BSRequest
oNode:=oInXML. DocumentElement. SelectSingleNode('//BSRequest');
p_accd:=oNode. GetAttribute('PACC');
p_accc:=oNode. GetAttribute('RACC');
p_sumd:=XMLToMoney(oNode. GetAttribute('A'));
p_paydt:=XMLToDate(oNode. GetAttribute('D'));
…
// передача параметров во процедуру обработки внешней Учетной истемы
// ЛОГИРОВАНИЕ ФАКТА ВЫЗОВА
TraceLog(LogDir, erLog, Module, Proc,'Start procedure AnyExternalProcedure with parameters '+
’p_cus=’+ p_cus+’ p_accd=’+p_accd+…);
AnyExternalProcedure (
p_cus,
p_accd,
p_accc,
p_sumd,
p_paydt,
p_qnum
retcodeString,
retcode);
// ЛОГИРОВАНИЕ ФАКТА ОКОНЧАНИЯ ВЫЗОВА
TraceLog(LogDir, erLog, Module, Proc,'Finish procedure AnyExternalProcedure: '+
’p_qnum=’+ p_qnum+’ retcode=’+ retcode+’ retcodeString=’+retcodeString +…);
if retcode<>0 then
begin
vError:='Error #'+IntToStr(retcode)+'. '+retcodeString;
SetErrorOutXML(oOutXML,
BS_ERROR_FROM_ABS, //ErrorCode
'', //ErrorMessage
vError); //ABSMessage
TraceLog(LogDir, erLog, Module, Proc,'Load Error. '+vError);
end else
begin
// проставляем статус в ответе
oNode:=oOutXML. DocumentElement. SelectSingleNode('//BSAnswer');
oNode. SetAttribute('REF',p_qnum);
oNode. SetAttribute('Status','Accepted');
SetErrorOutXML(oOutXML,
BS_NO_ERROR, //ErrorCode
'', //ErrorMessage
retcodeString);//ABSMessage
TraceLog(LogDir, erTrace, Module, Proc, Fmt. Format('Load OK. p_qnum=%s p_num=%s',p_qnum, p_num));
end;
TraceLog(LogDir, erTrace, Module, Proc,'Finish');
end;
function ProcessRequest(
oInXML:object;
oOutXML:object
):boolean;
var
vError:string;
vCode:integer;
sCustID:string;
begin
ClearError;
//создаем структуру ответа
sCustID:=oInXML. DocumentElement. SelectSingleNode('//BSHead').GetAttribute('CustomerID');
Result:=CreateAnswerStructure(oInXML, XML_Version_STD10,BS_A_TYPE,
cSysID, sCustID, oOutXML, vCode, vError);
if Not Result then
begin
SetError('Can not create answer xml. Error #'+IntToStr(vCode)+' '+vError);
Exit;
end;
if Not CheckInXML(oInXML, oOutXML) then Exit;
// далее обработка запроса
ProccessMyFunction (oInvProc, oInXML, oOutXML);
end;
initialization
Fmt:=GetFormater;
// считывание настроечных памертров
DocIndex:=GetStrParam('IFIZ', 'ABSAPI. InvoRetail. AccAcc. DocIndex','30');
end.
3.3.3.5. Часто используемые свойства и метода XML-объекта XmlParserDCOMName
Здесь описываются некоторые примеры работы с XML-объектами oInXML и oOutXML при реализации интерфейсной функции function ProcessRequest(oInXML:object; oOutXML:object):boolean;
Предположим, что во всех примерах oInXML имеет следующую структуру xml:
<x:BSMessage xmlns:x="BS_R_STM" Version="STD1.0" ID="625C3314CC"
ReqDateTime="T09:30:00.0000">
<BSHead CustomerID="2" SubSys="IC"/>
<BSRequest
BDate=""
EDate=""
ShowDocuments="Y"
ShowNullCirculations="N">
<AddFields>
<Id>GROUND</Id>
<Id>BICOFCONTRAGENT</Id>
<Id>BANKOFCONTRAGENT</Id>
</AddFields>
<Accounts>
<N CUR="RUR"></N>
<N CUR="USD"></N>
</Accounts>
</BSRequest>
</x:BSMessage>
3.3.3.5.1. Поиск одного или нескольких узлов
// возвращает узел BSHead входящего запроса
oNode:= oInXML. DocumentElement. SelectSingleNode('//BSHead');
// возвращает узел BSRequest входящего запроса
oNode:= oInXML. DocumentElement. SelectSingleNode('//BSHead/BSRequest');
// получение списка узлов
oNodesList:=oInXML. DocumentElement. SelectNodes('//BSRequest/Accounts/N');
// для указанного выше примера xml – цикл будет из 2-ух елементов
for i:=0 to oNodesList. length–1 do
begin
oOneNode:=oNodesList. Item(i);
sAccNum:=oNNode. Text;
sAccCode:=oNNode. GetAttribute('CUR');
end;
3.3.3.5.2. Запись/считывание аттрибута узла и его текста
// следующий код выведет
// поиск первого узла N
oOneNode:=oInXML. DocumentElement. SelectSingleNode('//BSRequest/Accounts/N');
// проверка, что узел найден
if oOneNode==Nil then Exit;
// считывание текста узла
sAccNum:= oOneNode. Text;
ShowMessage(’Read account ’+ oOneNode. Text); // выведется строка ”Read Account”
// запись текста узла
oOneNode. Text:=’’;
ShowMessage(’New account ’+ oOneNode. Text); // выведется строка ”New Account”
// считывание аттрибута
sAccCode:= oOneNode. GetAttribute('CUR');
ShowMessage(’Read currency ’+ sAccCode); // выведется строка ”Read currency RUR”
// запись аттрибута
oOneNode. SetAttribute('CUR',’USD’);
ShowMessage(’New currency ’+ oOneNode. GetAttribute('CUR')); // выведется строка ” New currency USD”
3.3.3.5.3. Добавление нового елемента с аттрибутами
CreateAnswerStructure(oInXML, XML_Version_STD10,BS_A_TYPE, cSysID, sCustID, oOutXML, vCode, vError);
// создаем новый елемент
oAccNode:=oOutXML. createElement('Acc');
// записываем его аттрибуты
oAccNode. SetAttribute('N',’’);
oAccNode. SetAttribute('CUR',’810’);
oAccNode. SetAttribute('NAME',’Расчетный счет’);
oAccNode. SetAttribute('TYPE',’A’);
// дописываем новый елемент в ветку BSAnswer
oBSAnswer:=oOutXML. DocumentElement. SelectSingleNode('//BSAnswer');
oBSAnswer. appendChild(oAccNode);
// либо короче
oOutXML. DocumentElement. SelectSingleNode('//BSAnswer').appendChild(oAccNode);
/////////////////////////////////////
в итоге будет создан следующий XML
<x:BSMessage xmlns:x="BS_A_STM" …>
<BSAnswer>
<Acc N=”” CUR=”810” NAME=”’Расчетный счет” TYPE=” A”/>
</BSAnswer>
…
</x:BSMessage >



