Текущее время: Пт, сен 21 2018, 17:27

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Перекодировка части XML в base64
СообщениеДобавлено: Чт, июн 25 2015, 14:59 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 17:22
Сообщения: 9
Уважаемые гуру.
Прошу Вашей подсказки:
Для отправки на веб сервис нужно часть xml запроса закодировать в base64
и заключить его в CDATA.

Итоговый формат запроса примерно такой:
<getGoods>
<Goods>
<![CDATA[Здесь XML структура закодированая в base64]]>
</Goods>
<I>1000</I>
</getGoods>

Каким образом получить такой результат?
Я использую xslt маппинг.
Спасибо всем за участие.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Чт, июн 25 2015, 15:13 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
если это джавашный XSLT и PI современный (7.3, 7.4), можно джава-расширение написать и положить в .zip где лежит XSLT
пример есть в комплекте поставки

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Чт, июн 25 2015, 16:56 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 17:22
Сообщения: 9
Не силен в Java к сожалению :( .
Хотелось бы решить с помощью стандартных модулей если это возможно.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Чт, июн 25 2015, 22:07 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
>часть xml запроса
хаха, ищи стандартный модуль

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Чт, июн 25 2015, 22:08 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
напиши версию (с точностью до SP) своей системы, посмотрю и напишу расширение, оно примитивное. Если система конечно поддержит в данном SP.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пт, июн 26 2015, 00:58 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 17:22
Сообщения: 9
Спасибо за ответы.

Версия
Name Version Applied
sap.com/SAP-JEECOR 7.00 SP14 (1000.7.00.14.0.20071210172300)
sap.com/SAP-JEE 7.00 SP14 (1000.7.00.14.0.20071210172039)

Просматривал возможность обработать Java классом. В стандартном java есть класс java.util.Base64 с помощью него я написал конвертировщик содержимого переменной, но дальше этого деле не движется :( .
Возможно ли с помощью этого класса выполнить мою задачу?
Допустим я заключу необходимую часть XML в особый тег например <XXX> подскажите примерно как будет выглядеть мой класс для кодирования содержимого этих тегов и потом замена этих тегов на CDATA.. :?

Подскажите более простой путь.. Заведомо благодарю.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пт, июн 26 2015, 10:57 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
Не, для такого старого мой способ не подойдёт.
Класс-то нужный, но придётся делать лишний графический меппинг с полутривиальной обработкой (всё 1:1 кроме тега XXX).
Такой вариант подойдёт?

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пт, июн 26 2015, 11:25 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 17:22
Сообщения: 9
Ну одним маппингом больше одним меньше.. Я думаю можно.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пт, июн 26 2015, 11:33 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
в XSLT ты подготавливаешь XXX с CDATA.
потом делаешь графический меппинг 1:1 везде, кроме XXX
для XXX делаешь такую пользовательскую функцию типа SingleValues с одним входом x типа String. В тело пишешь (пока что):
String y = x + "\t" + x;
return y;

и пробуешь -- выдаётся ли на выход продублированный вход.

Сейчас напишу base64, он простой должен быть, только джавы 1.4 нет под руками для проверки.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пт, июн 26 2015, 11:51 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
java.util.Base64 не было в джаве 1.4. Можно через SAP XML Toolkit найти нужный метод если он есть, ещё есть вариант через sun.misc.BASE64Encoder но обычно при компиляции не из java.*-пакетов будет ошибка.

Нашёл код для 1.4 на первом попавшемся форуме.
Из импортов нужно только java.io.UnsupportedEncodingException.


Вот код:
Code:
try {
         byte[] d = x.getBytes("UTF-8");
          if (d == null) return null;
          byte data[] = new byte[d.length+2];
          System.arraycopy(d, 0, data, 0, d.length);
          byte dest[] = new byte[(data.length/3)*4];

          // 3-byte to 4-byte conversion
          for (int sidx = 0, didx=0; sidx < d.length; sidx += 3, didx += 4)
          {
            dest[didx]   = (byte) ((data[sidx] >>> 2) & 077);
            dest[didx+1] = (byte) ((data[sidx+1] >>> 4) & 017 |
                        (data[sidx] << 4) & 077);
            dest[didx+2] = (byte) ((data[sidx+2] >>> 6) & 003 |
                        (data[sidx+1] << 2) & 077);
            dest[didx+3] = (byte) (data[sidx+2] & 077);
          }

          // 0-63 to ascii printable conversion
          for (int idx = 0; idx <dest.length; idx++)
          {
            if (dest[idx] < 26)     dest[idx] = (byte)(dest[idx] + 'A');
            else if (dest[idx] < 52)  dest[idx] = (byte)(dest[idx] + 'a' - 26);
            else if (dest[idx] < 62)  dest[idx] = (byte)(dest[idx] + '0' - 52);
            else if (dest[idx] < 63)  dest[idx] = (byte)'+';
            else            dest[idx] = (byte)'/';
          }

          // add padding
          for (int idx = dest.length-1; idx > (d.length*4)/3; idx--)
          {
            dest[idx] = (byte)'=';
          }
          return new String(dest);         
      } catch (UnsupportedEncodingException e) {
             throw new RuntimeException("cannot convert to UTF: " + e.getMessage());
      }

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Вс, июн 28 2015, 17:39 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 17:22
Сообщения: 9
Я скомпилировал и присоединил этот джава класс, но при обработке в xi ошибка <SAP:Stack>Incompatible class versions (linkage error)</SAP:Stack>
Я пробовал и 1.4 и 1.6 и 1.8 все равно такая же ошибка . Компилировал с помощью javac.
Как мне поступить? Спасибо.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пн, июн 29 2015, 11:49 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
не надо ничего самому компилировать. У тебя же графический меппинг, он сам скомпилирует.

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пн, июн 29 2015, 13:04 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 17:22
Сообщения: 9
А код который вы указали куда вставить?


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пн, июн 29 2015, 16:32 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 18:44
Сообщения: 993
Откуда: что и все
Пол: Мужской
см выше
Цитата:
потом делаешь графический меппинг 1:1 везде, кроме XXX
для XXX делаешь такую пользовательскую функцию типа SingleValues с одним входом x типа String. В тело пишешь (пока что):
String y = x + "\t" + x;
return y;

_________________
Telegram-chat: PO, CPI-PI, java, groovy


Пометить тему как нерешенную
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Перекодировка части XML в base64
СообщениеДобавлено: Пн, июн 13 2016, 17:12 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 17:22
Сообщения: 9
Простите за долгий ответ, но этот проект из срочного на работе перешел во вялотекущий и несрочный и закрутило на новом проекте. Но тем не менее метод предложенный вами работает и кодирует прекрасно. Большое спасибо!.

Теперь возникла проблема:

По аналогии настроил декодирование из base64, настроил графический маппинг, нашел код на одном из форумов(видимо тот же из которого вы взяли кодирование) код привожу ниже:

Code:
        if (x == null)  return  null;
        byte data[] = x.getBytes();

        int tail = data.length;
        while (data[tail-1] == '=')  tail--;
        byte dest[] = new byte[tail - data.length/4];

        // ascii printable to 0-63 conversion
        for (int idx = 0; idx <data.length; idx++)
        {
          if (data[idx] == '=')    data[idx] = 0;
          else if (data[idx] == '/') data[idx] = 63;
          else if (data[idx] == '+') data[idx] = 62;
          else if (data[idx] >= '0'  &&  data[idx] <= '9')
            data[idx] = (byte)(data[idx] - ('0' - 52));
          else if (data[idx] >= 'a'  &&  data[idx] <= 'z')
            data[idx] = (byte)(data[idx] - ('a' - 26));
          else if (data[idx] >= 'A'  &&  data[idx] <= 'Z')
            data[idx] = (byte)(data[idx] - 'A');
        }

        // 4-byte to 3-byte conversion
        int sidx, didx;
        for (sidx = 0, didx=0; didx < dest.length-2; sidx += 4, didx += 3)
        {
          dest[didx]   = (byte) ( ((data[sidx] << 2) & 255) |
                  ((data[sidx+1] >>> 4) & 3) );
          dest[didx+1] = (byte) ( ((data[sidx+1] << 4) & 255) |
                  ((data[sidx+2] >>> 2) & 017) );
          dest[didx+2] = (byte) ( ((data[sidx+2] << 6) & 255) |
                  (data[sidx+3] & 077) );
        }
        if (didx < dest.length)
        {
          dest[didx]   = (byte) ( ((data[sidx] << 2) & 255) |
                  ((data[sidx+1] >>> 4) & 3) );
        }
        if (++didx < dest.length)
        {
          dest[didx]   = (byte) ( ((data[sidx+1] << 4) & 255) |
                  ((data[sidx+2] >>> 2) & 017) );
        }

          return new String(dest);     


Декодирование успешно проходит, но в xml весь русский текст теперь идет в таком виде:
��������������

Понимаю что надо что то сделать с кодировкой, но никак не пойму что именно)..

Не посчитайте за наглость но нужна помощь.
Заранее премного благодарен любой подсказке.


Пометить тему как нерешенную
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 20 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 4 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB