20. 04. 2018

загрузка xml в БД организации


Можно ли каким-либо образом организовать загрузку поступающих XML в нашу БД

Загрузку xml в БД можно организовать следующим образом:

1. При помощи модуля XSLTransform преобразовать XML в SQL скрипт

2. С использованием модуля ExtProg вызвать внешнюю программу - утилиту работы с СУБД, которая используя сформированный SQL добавит данные

Рассмотрим на примере поступающих извещений IZVTUB (440П):

<?xml version="1.0" encoding="WINDOWS-1251"?>
<Файл ТипИнф="ИЗВЦБКОНТР" ТелОтпр="(495) 123-45-67" ВерсПрог="БИНГО 3.12.01" ФамОтпр="Иванов" ДолжнОтпр="оператор" ИдЭС="6F961911-8B86-D011-B42D-00CF4FC994FF" ВерсФорм="3.00">
    <ИЗВЦБКОНТР КодРезПроверки="73" ДатаВремяПроверки="2015-06-17T09:30:47" ИмяФайла="AFN_0000000_MIFNS00_20171005_00001" Пояснение="ошибка проверки"/>
</Файл>

Создадим для преобразования XML в SQL файл преобразования izvtub2sql.xslt следующего содержания:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output version="1.0" method="text" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
 <xsl:apply-templates select="/*"/>
</xsl:template>
<!-- generate INSERT STATEMENT -->
<xsl:template match="Файл">
insert into IZVTUB (IZV_FILENAME,IZV_DATE,IZV_RESULT,IZV_TEXT)
values(
'<xsl:value-of select="ИЗВЦБКОНТР/@ИмяФайла"/>',
'<xsl:value-of select="ИЗВЦБКОНТР/@ДатаВремяПроверки"/>',
'<xsl:value-of select="ИЗВЦБКОНТР/@КодРезПроверки"/>',
'<xsl:value-of select="ИЗВЦБКОНТР/@Пояснение"/>');
</xsl:template>
</xsl:stylesheet>

Будем считать что наша БД работает под управлением Firebird и хранится в C:\DB\test.fdb

Файл izvtub2sql.xslt поместим в каталог .\XSLT\ и напишем сценарий обработки:

[Section01]
Source=C:\IZVTUB
Result=C:\IZVTUB\DONE
Mask=IZV*.xml
run0_XSLTransform=.\XSLT\izvtub2sql.xslt .\FILES\sql .sql

[Section02]
Source=.\FILES\sql
noResult=1
Mask=IZV*.sql
run0_extprog=isql C:\DB\test.fdb -u sysdba -p masterkey -i %FILE%

Поместим в C:\IZVTUB поступившие IZVTUB*.xml и обработаем используя наш сценарий.

В соответствии с первой секцией файлы IZV*.xml будут преобразованы в IZV*.xml.sql, при этом исходные IZV*.xml будут переложены в каталог обработанных - C:\IZVTUB\DONE, а сформированные sql будут выложены в .\FILES\sql

В итоге для приведенного выше IZVTUB получим sql следующего содержания:

insert into IZVTUB (IZV_FILENAME,IZV_DATE,IZV_RESULT,IZV_TEXT)
values(
'AFN_0000000_MIFNS00_20171005_00001',
'2015-06-17T09:30:47',
'73',
'ошибка проверки');

вторая секция исполнит скрипт и добавит в БД запись с информацией о поступившем файле