XML + УФЭБС

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

XML + УФЭБС

Сообщение AnDS »

Страна потихоньку переходит на УФЭБС (я про банки говорю).
В связи с этим вопрос/просьба.

Реализовывал ли кто-нибудь чтение этих XML-файлов?
Если да, то может быть поделитесь если не исходниками, то кратким разъяснением в какую сторону копать?

На форуме искал. Нашел пример. Не совсем понял как быть, если я, например, теги xml-файла не знаю заранее?
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

немножко глупость сказал. судя по примеру (который у меня пока не заработал :-) теги мы знаем. они в очереди находятся.
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Не понимаю почему не работает с моим файлом. те файлы, что в examples лежат нормально парсятся. Мой файл не парсится. :-(
начиная с того, что строка <?xml version="1.0" encoding="WINDOWS-1251" ?> вызывает ошибку открытия файла ( в команде xmlDoc &= XMLFileToDOM('test.xml') )
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение 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> 
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8020
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

Сообщение Игорь Столяров »

Можно я прерву твой монолог ... ? ;)

Посмотри FreeWare библиотеку IQXML для работы с XML структурами.
Ссылка на страничку: http://www.innquest.com/iqxml/
Все, что нужно - там есть.
Работа с "русскими" XML файлами проверена на многих программах (в т.ч. и для банков), хотя есть некоторые "особенности" ... ;)
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Спасибо за ссылку.
Чуть понятнее стало и даже некоторые файлы парсятся.
Остается сложность с обработкой файлов большой длины.
Думаю что это тоже решается.

Что же касается монолога... :-) ну так думается лучше. Если напряг этим -- сорри. :-)
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Кстати, вопрос про Base64 -- подпрограммки декодирования файла, зашифрованного Base64 есть у кого-нибудь?
Кодирование на этом форуме я видел. Но мне нужно декодирование.

Написал сам такую подпрограммку, но работает не шустро.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 8020
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 28 раз
Поблагодарили: 94 раза

Сообщение Игорь Столяров »

Что есть "большой файл" ? Цифру можно озвучить ?

Как говорил дворник в одном произведении "Кому и кобыла невеста ..." ;)))

У меня без проблем последний релиз IQXML пишет и парсит 20 MByte XML файлы. Думаю и далее проблем быть не должно - просто реального опыта работы с большими размерами файлов у меня нет ...
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Гм. Парсит он может и хорошо. А вот как там Base64 раскодировать?
FromBase64 раскодирует хорошо конечно, но мне показалось, что подтормаживает. на AthlonXP3000+
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сообщение Yufil »

AnDS писал(а):вот пример, который не парсится:
Качни http://www.tacis-dipol.ru/fil/xml1251.zip и будет тебе щастье.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

Сообщение Yufil »

AnDS писал(а):немножко глупость сказал. судя по примеру (который у меня пока не заработал :-) теги мы знаем. они в очереди находятся.
У меня движок форума скушал половину примера :(
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Сообщение 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
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Ravenous
Бывалый
Сообщения: 58
Зарегистрирован: 06 Июль 2005, 14:25
Откуда: Москва
Поблагодарили: 1 раз

Сообщение Ravenous »

Благодарень за терпение и понимание.

Изображение
AnDS
Активист
Сообщения: 119
Зарегистрирован: 03 Ноябрь 2005, 9:32

Сообщение AnDS »

Всем спасибо за помощь. Программку необходимую написал.
Ответить