Текущее время: Чт, мар 28 2024, 21:53

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




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

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

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

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


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

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

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


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

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


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

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

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


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

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

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


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

Зарегистрирован:
Пн, сен 30 2013, 16: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, 09:57 
Директор
Директор

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

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


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

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


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

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
в 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, 10:51 
Директор
Директор

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
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, 16:39 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 16: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, 10:49 
Директор
Директор

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

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


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

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


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

Зарегистрирован:
Вт, июл 18 2006, 17:44
Сообщения: 1001
Откуда: что и все
Пол: Мужской
см выше
Цитата:
потом делаешь графический меппинг 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, 16:12 
Начинающий
Начинающий

Зарегистрирован:
Пн, сен 30 2013, 16: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 + 3 часа


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

Сейчас этот форум просматривают: Google [Bot]


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

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