Страница 1 из 1
XML + УФЭБС
Добавлено: 30 Август 2006, 9:28
AnDS
Страна потихоньку переходит на УФЭБС (я про банки говорю).
В связи с этим вопрос/просьба.
Реализовывал ли кто-нибудь чтение этих XML-файлов?
Если да, то может быть поделитесь если не исходниками, то кратким разъяснением в какую сторону копать?
На форуме искал. Нашел пример. Не совсем понял как быть, если я, например, теги xml-файла не знаю заранее?
Добавлено: 30 Август 2006, 9:55
AnDS
немножко глупость сказал. судя по примеру (который у меня пока не заработал

теги мы знаем. они в очереди находятся.
Добавлено: 30 Август 2006, 11:06
AnDS
Не понимаю почему не работает с моим файлом. те файлы, что в examples лежат нормально парсятся. Мой файл не парсится.

начиная с того, что строка <?xml version="1.0" encoding="WINDOWS-1251" ?> вызывает ошибку открытия файла ( в команде xmlDoc &= XMLFileToDOM('test.xml') )
Добавлено: 30 Август 2006, 11:13
AnDS
вот пример, который не парсится:
Код: Выделить всё
<?xml version="1.0" encoding="windows-1251"?>
<PacketEPD EDNo="20000" EDDate="2004-07-30" EDAuthor="4525983000" EDQuantity="6" Sum="4897510000" SystemCode="01" xmlns="urn:cbr-ru:ed:v1.1">
<ED101 EDNo="20000" EDDate="2004-07-30" EDAuthor="4525983000" PaytKind="1" Sum="4000000000" TransKind="01" Priority="6" ReceiptDate="2004-07-30" ChargeOffDate="2004-07-30" SystemCode="01">
<AccDoc AccDocNo="188" AccDocDate="2004-07-30"/>
<Payer INN="007701028536" PersonalAcc="31304810100000000823">
<Name>ООО КБ "Огни Москвы"</Name>
<Bank BIC="044525983" CorrespAcc="30101810700000000983"/>
</Payer>
<Payee INN="7744001497" PersonalAcc="47423810000000000037">
<Name>ЗАО АБ "Газпромбанк"</Name>
<Bank BIC="044525823" CorrespAcc="30101810200000000823"/>
</Payee>
<Purpose>Возврат мбк от 29.07.04</Purpose>
</ED101>
<ED101 EDNo="20001" EDDate="2004-07-30" EDAuthor="4525983000" PaytKind="1" Sum="9210000" TransKind="01" Priority="6" ReceiptDate="2004-07-30" ChargeOffDate="2004-07-30" SystemCode="01">
<AccDoc AccDocNo="184" AccDocDate="2004-07-30"/>
<Payer INN="007701028536" PersonalAcc="40906810100080000083">
<Name>ООО КБ "Огни Москвы"</Name>
<Bank BIC="044525983" CorrespAcc="30101810700000000983"/>
</Payer>
<Payee INN="7733021244" PersonalAcc="40702810338260106536">
<Name>ООО "ЛЮБАВА"</Name>
<Bank BIC="044525225" CorrespAcc="30101810400000000225"/>
</Payee>
<Purpose>Перечисление согласно договора</Purpose>
</ED101>
<ED101 EDNo="20002" EDDate="2004-07-30" EDAuthor="4525983000" PaytKind="1" Sum="14760000" TransKind="01" Priority="6" ReceiptDate="2004-07-30" ChargeOffDate="2004-07-30" SystemCode="01">
<AccDoc AccDocNo="181" AccDocDate="2004-07-30"/>
<Payer INN="007701028536" PersonalAcc="40906810800080000079">
<Name>ООО КБ "Огни Москвы"</Name>
<Bank BIC="044525983" CorrespAcc="30101810700000000983"/>
</Payer>
<Payee INN="7735002550" PersonalAcc="40702810912110000015">
<Name>ООО "Комис-20"</Name>
<Bank BIC="044583345" CorrespAcc="30101810500000000345"/>
</Payee>
<Purpose>Перечисление согласно договора</Purpose>
</ED101>
<ED101 EDNo="20003" EDDate="2004-07-30" EDAuthor="4525983000" PaytKind="1" Sum="49490000" TransKind="01" Priority="6" ReceiptDate="2004-07-30" ChargeOffDate="2004-07-30" SystemCode="01">
<AccDoc AccDocNo="180" AccDocDate="2004-07-30"/>
<Payer INN="007701028536" PersonalAcc="40906810500080000078">
<Name>ООО КБ "Огни Москвы"</Name>
<Bank BIC="044525983" CorrespAcc="30101810700000000983"/>
</Payer>
<Payee INN="5036057962" PersonalAcc="40702810112110000022">
<Name>ООО"Торговая сеть"Подольский Квартал"</Name>
<Bank BIC="044583345" CorrespAcc="30101810500000000345"/>
</Payee>
<Purpose>Перечисление согласно договора</Purpose>
</ED101>
<ED101 EDNo="20004" EDDate="2004-07-30" EDAuthor="4525983000" PaytKind="1" Sum="15580000" TransKind="01" Priority="6" ReceiptDate="2004-07-30" ChargeOffDate="2004-07-30" SystemCode="01">
<AccDoc AccDocNo="179" AccDocDate="2004-07-30"/>
<Payer INN="007701028536" PersonalAcc="40906810200080000077">
<Name>ООО КБ "Огни Москвы"</Name>
<Bank BIC="044525983" CorrespAcc="30101810700000000983"/>
</Payer>
<Payee INN="7735108290" PersonalAcc="40702810712110000024">
<Name>ООО "АСП-Групп"</Name>
<Bank BIC="044583345" CorrespAcc="30101810500000000345"/>
</Payee>
<Purpose>Перечисление согласно договора</Purpose>
</ED101>
<ED101 EDNo="20005" EDDate="2004-07-30" EDAuthor="4525983000" PaytKind="1" Sum="808470000" TransKind="01" Priority="6" ReceiptDate="2004-07-30" ChargeOffDate="2004-07-30" SystemCode="01">
<AccDoc AccDocNo="178" AccDocDate="2004-07-30"/>
<Payer INN="007701028536" PersonalAcc="40906810900080000076">
<Name>ООО КБ "Огни Москвы"</Name>
<Bank BIC="044525983" CorrespAcc="30101810700000000983"/>
</Payer>
<Payee INN="7725141594" PersonalAcc="40702810838260106049">
<Name>ООО "Торкас"</Name>
<Bank BIC="044525225" CorrespAcc="30101810400000000225"/>
</Payee>
<Purpose>Перечисление согласно договора 01/33-210 от 01.06.2004</Purpose>
</ED101>
</PacketEPD>
Добавлено: 30 Август 2006, 11:18
Игорь Столяров
Можно я прерву твой монолог ... ?
Посмотри FreeWare библиотеку IQXML для работы с XML структурами.
Ссылка на страничку:
http://www.innquest.com/iqxml/
Все, что нужно - там есть.
Работа с "русскими" XML файлами проверена на многих программах (в т.ч. и для банков), хотя есть некоторые "особенности" ...

Добавлено: 30 Август 2006, 14:45
AnDS
Спасибо за ссылку.
Чуть понятнее стало и даже некоторые файлы парсятся.
Остается сложность с обработкой файлов большой длины.
Думаю что это тоже решается.
Что же касается монолога...

ну так думается лучше. Если напряг этим -- сорри.

Добавлено: 30 Август 2006, 16:25
AnDS
Кстати, вопрос про Base64 -- подпрограммки декодирования файла, зашифрованного Base64 есть у кого-нибудь?
Кодирование на этом форуме я видел. Но мне нужно декодирование.
Написал сам такую подпрограммку, но работает не шустро.
Добавлено: 31 Август 2006, 8:20
Игорь Столяров
Что есть "большой файл" ? Цифру можно озвучить ?
Как говорил дворник в одном произведении "Кому и кобыла невеста ..."

))
У меня без проблем последний релиз IQXML пишет и парсит 20 MByte XML файлы. Думаю и далее проблем быть не должно - просто реального опыта работы с большими размерами файлов у меня нет ...
Добавлено: 31 Август 2006, 8:33
AnDS
Гм. Парсит он может и хорошо. А вот как там Base64 раскодировать?
FromBase64 раскодирует хорошо конечно, но мне показалось, что подтормаживает. на AthlonXP3000+
Добавлено: 31 Август 2006, 13:37
Yufil
AnDS писал(а):вот пример, который не парсится:
Качни
http://www.tacis-dipol.ru/fil/xml1251.zip и будет тебе щастье.
Добавлено: 31 Август 2006, 13:45
Yufil
AnDS писал(а):немножко глупость сказал. судя по примеру (который у меня пока не заработал

теги мы знаем. они в очереди находятся.
У меня движок форума скушал половину примера

Добавлено: 31 Август 2006, 14:36
Admin
Вот на Васике есть ...
Код: Выделить всё
' Decodes a base-64 encoded string (BSTR type).
' 1999 - 2004 Antonin Foller, http://www.motobit.com
' 1.01 - solves problem with Access And 'Compare Database' (InStr)
Function Base64Decode(ByVal base64String)
'rfc1521
'1999 Antonin Foller, Motobit Software, http://Motobit.cz
Const Base64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
Dim dataLength, sOut, groupBegin
'remove white spaces, If any
base64String = Replace(base64String, vbCrLf, "")
base64String = Replace(base64String, vbTab, "")
base64String = Replace(base64String, " ", "")
'The source must consists from groups with Len of 4 chars
dataLength = Len(base64String)
If dataLength Mod 4 <> 0 Then
Err.Raise 1, "Base64Decode", "Bad Base64 string."
Exit Function
End If
' Now decode each group:
For groupBegin = 1 To dataLength Step 4
Dim numDataBytes, CharCounter, thisChar, thisData, nGroup, pOut
' Each data group encodes up To 3 actual bytes.
numDataBytes = 3
nGroup = 0
For CharCounter = 0 To 3
' Convert each character into 6 bits of data, And add it To
' an integer For temporary storage. If a character is a '=', there
' is one fewer data byte. (There can only be a maximum of 2 '=' In
' the whole string.)
thisChar = Mid(base64String, groupBegin + CharCounter, 1)
If thisChar = "=" Then
numDataBytes = numDataBytes - 1
thisData = 0
Else
thisData = InStr(1, Base64, thisChar, vbBinaryCompare) - 1
End If
If thisData = -1 Then
Err.Raise 2, "Base64Decode", "Bad character In Base64 string."
Exit Function
End If
nGroup = 64 * nGroup + thisData
Next
'Hex splits the long To 6 groups with 4 bits
nGroup = Hex(nGroup)
'Add leading zeros
nGroup = String(6 - Len(nGroup), "0") & nGroup
'Convert the 3 byte hex integer (6 chars) To 3 characters
pOut = Chr(CByte("&H" & Mid(nGroup, 1, 2))) + _
Chr(CByte("&H" & Mid(nGroup, 3, 2))) + _
Chr(CByte("&H" & Mid(nGroup, 5, 2)))
'add numDataBytes characters To out string
sOut = sOut & Left(pOut, numDataBytes)
Next
Base64Decode = sOut
End Function
Добавлено: 31 Август 2006, 21:19
Ravenous
Добавлено: 13 Сентябрь 2006, 17:57
AnDS
Всем спасибо за помощь. Программку необходимую написал.