SAPфорум.RU https://sapboard.ru/forum/ |
|
Перекодировка части XML в base64 https://sapboard.ru/forum/viewtopic.php?f=70&t=90807 |
Страница 1 из 2 |
Автор: | mediaman [ Чт, июн 25 2015, 13:59 ] |
Заголовок сообщения: | Перекодировка части XML в base64 |
Уважаемые гуру. Прошу Вашей подсказки: Для отправки на веб сервис нужно часть xml запроса закодировать в base64 и заключить его в CDATA. Итоговый формат запроса примерно такой: <getGoods> <Goods> <![CDATA[Здесь XML структура закодированая в base64]]> </Goods> <I>1000</I> </getGoods> Каким образом получить такой результат? Я использую xslt маппинг. Спасибо всем за участие. |
Автор: | chumpa [ Чт, июн 25 2015, 14:13 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
если это джавашный XSLT и PI современный (7.3, 7.4), можно джава-расширение написать и положить в .zip где лежит XSLT пример есть в комплекте поставки |
Автор: | mediaman [ Чт, июн 25 2015, 15:56 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
Не силен в Java к сожалению . Хотелось бы решить с помощью стандартных модулей если это возможно. |
Автор: | chumpa [ Чт, июн 25 2015, 21:07 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
>часть xml запроса хаха, ищи стандартный модуль |
Автор: | chumpa [ Чт, июн 25 2015, 21:08 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
напиши версию (с точностью до SP) своей системы, посмотрю и напишу расширение, оно примитивное. Если система конечно поддержит в данном SP. |
Автор: | mediaman [ Чт, июн 25 2015, 23:58 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
Спасибо за ответы. Версия 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.. Подскажите более простой путь.. Заведомо благодарю. |
Автор: | chumpa [ Пт, июн 26 2015, 09:57 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
Не, для такого старого мой способ не подойдёт. Класс-то нужный, но придётся делать лишний графический меппинг с полутривиальной обработкой (всё 1:1 кроме тега XXX). Такой вариант подойдёт? |
Автор: | mediaman [ Пт, июн 26 2015, 10:25 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
Ну одним маппингом больше одним меньше.. Я думаю можно. |
Автор: | chumpa [ Пт, июн 26 2015, 10:33 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
в XSLT ты подготавливаешь XXX с CDATA. потом делаешь графический меппинг 1:1 везде, кроме XXX для XXX делаешь такую пользовательскую функцию типа SingleValues с одним входом x типа String. В тело пишешь (пока что): String y = x + "\t" + x; return y; и пробуешь -- выдаётся ли на выход продублированный вход. Сейчас напишу base64, он простой должен быть, только джавы 1.4 нет под руками для проверки. |
Автор: | chumpa [ Пт, июн 26 2015, 10:51 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
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()); } |
Автор: | mediaman [ Вс, июн 28 2015, 16:39 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
Я скомпилировал и присоединил этот джава класс, но при обработке в xi ошибка <SAP:Stack>Incompatible class versions (linkage error)</SAP:Stack> Я пробовал и 1.4 и 1.6 и 1.8 все равно такая же ошибка . Компилировал с помощью javac. Как мне поступить? Спасибо. |
Автор: | chumpa [ Пн, июн 29 2015, 10:49 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
не надо ничего самому компилировать. У тебя же графический меппинг, он сам скомпилирует. |
Автор: | mediaman [ Пн, июн 29 2015, 12:04 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
А код который вы указали куда вставить? |
Автор: | chumpa [ Пн, июн 29 2015, 15:32 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
см выше Цитата: потом делаешь графический меппинг 1:1 везде, кроме XXX
для XXX делаешь такую пользовательскую функцию типа SingleValues с одним входом x типа String. В тело пишешь (пока что): String y = x + "\t" + x; return y; |
Автор: | mediaman [ Пн, июн 13 2016, 16:12 ] |
Заголовок сообщения: | Re: Перекодировка части XML в base64 |
Простите за долгий ответ, но этот проект из срочного на работе перешел во вялотекущий и несрочный и закрутило на новом проекте. Но тем не менее метод предложенный вами работает и кодирует прекрасно. Большое спасибо!. Теперь возникла проблема: По аналогии настроил декодирование из 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 весь русский текст теперь идет в таком виде: �������������� Понимаю что надо что то сделать с кодировкой, но никак не пойму что именно).. Не посчитайте за наглость но нужна помощь. Заранее премного благодарен любой подсказке. |
Страница 1 из 2 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |