Текущее время: Вт, июн 24 2025, 02:08

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


Правила форума


ВНИМАНИЕ!

Вопросы по SAP Query и Quick View - сюда



Начать новую тему Ответить на тему  [ Сообщений: 14 ] 
Автор Сообщение
 Заголовок сообщения: Создание XML файла
СообщениеДобавлено: Вс, окт 05 2014, 03:15 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 409
Всем доброго времени суток.

Необходимо создать XML файл.
Решил сделать через трансформацию.

Получилось:
-<ZMTR_ST_XML>
<CUSTNO>2000012</CUSTNO>
<TELF1>1111</TELF1>
</ZMTR_ST_XML>

Но мне необходимо получить XML такого вида:

-<ZMTR_ST_XML CUSTNO='2000012' TELF1='1111' >
</ZMTR_ST_XML>

Т.е. атрибуты должны идти за корневым элементом и через знак =.
Как это сделать?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Вс, окт 05 2014, 07:51 
Ассистент
Ассистент

Зарегистрирован:
Пн, май 07 2007, 14:31
Сообщения: 35
http://scn.sap.com/docs/DOC-43794
внизу есть пример для кода трансформации


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Пн, окт 06 2014, 03:57 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Да и на форуме было:

viewtopic.php?f=13&t=86565


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Пн, окт 06 2014, 21:41 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 409
казалось, что все получилось, НО при изменении названия атрибута на нужные (русские) названия, стала возникать ошибка.

Если меняю только один элемент из 7, все хорошо:
<Z_ST_XML>
<tt:attribute name="ПризнСвед8" value-ref="CUSTNO"/>
<tt:attribute name="LAND" value-ref="LAND"/>
<tt:attribute name="NAME1" value-ref="NAME1"/>
<tt:attribute name="TELF1" value-ref="TELF1"/>
<tt:attribute name="ERNAME" value-ref="ERNAME"/>
<NAME2 tt:value-ref="NAME2"/>
<ST_LAND>
<tt:attribute name="LAND" value-ref="ST_LAND.LAND"/>
<tt:attribute name="LANDX" value-ref="ST_LAND.LANDX"/>
</ST_LAND>
</Z_ST_XML>

Но если меняю второй атрибут:

<Z_ST_XML>
<tt:attribute name="ПризнСвед8" value-ref="CUSTNO"/>
<tt:attribute name="LAND" value-ref="LAND"/>
<tt:attribute name="ПризнСвед9" value-ref="NAME1"/>
<tt:attribute name="TELF1" value-ref="TELF1"/>
<tt:attribute name="ERNAME" value-ref="ERNAME"/>
<NAME2 tt:value-ref="NAME2"/>
<ST_LAND>
<tt:attribute name="LAND" value-ref="ST_LAND.LAND"/>
<tt:attribute name="LANDX" value-ref="ST_LAND.LANDX"/>
</ST_LAND>
</Z_ST_XML>


, то ошибка:

Имя содержит ошибочный знак. Ошибка при обработке ресурса ''file:///D:/home1c/20141006_223936.xml''. Строка 2,Положение 73
<CUSTOMER_DATA><ZMTR_ST_XML ERNAME="IVANOV" LAND="RU" TELF1="1111" Призн

Как исправить ситуацию, чтобы атрибуты называть по-русски.


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Вт, окт 07 2014, 07:26 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Кодировка в заголовке правильная подставлена?
<?xml version="1.0" encoding="UTF-8"?>

Соответствует ли кодировке в файле?
В трансформации нет ничего типа такого:
<xsl:output encoding="UTF-8"/>
?


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Вт, окт 07 2014, 16:43 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 409
Да, <?xml version="1.0" encoding="UTF-8"?>

Потом, по аналогии со стандартной обработкой декларации по НДС перекодирую в win-1251.

Code:
* Создание XML
lr_xml            = cl_ixml=>create( ).
lr_document       = lr_xml->create_document( ).
lr_stream_factory = lr_xml->create_stream_factory( ).
lr_ostream        = lr_stream_factory->create_ostream_itable( table = lt_data_xml[] ).

CALL TRANSFORMATION zmtr_tr_cust_003
SOURCE customer_data = gt_source[]
RESULT XML lr_ostream .

cl_gui_frontend_services=>get_sapgui_workdir( CHANGING sapworkdir = lv_temp_dir ).

lv_temp_dir = 'D:\home1c'.
CONCATENATE lv_temp_dir '\' sy-datum '_' sy-timlo '.xml'
       INTO lv_filename.

* Выгрузка на локальную машину
CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
    filename         = lv_filename
    filetype         = 'BIN'
  CHANGING
    data_tab         = lt_data_xml[]
  EXCEPTIONS
    file_write_error = 1
    OTHERS           = 99.

* Далее перекодировка в 1251

PERFORM convert2win1251 CHANGING pv_error.

* Save XML data file to PC file
CALL METHOD cl_gui_frontend_services=>gui_download
  EXPORTING
*     bin_filesize = l_len
    filename     = lv_filename
    filetype     = 'BIN'
  CHANGING
    data_tab     = gt_srctab[]
  EXCEPTIONS
    OTHERS       = 1.


Но до перекодировки при наличии ошибки дело не доходит.
Может можно как-то проще сразу получить windows-1251 ?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Ср, окт 08 2014, 04:54 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Кажется вы используете не полноценную XSLT-трансформацию, а саповскую "простую трансфрмацию", а если имя атрибута будет состоять из одной русской буквы сработает?

CrecerRu написал(а):
Может можно как-то проще сразу получить windows-1251

В XSLT-трансформациях как раз используется конструкция <xsl:output encoding="нужная итоговая кодировка"/>


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Ср, окт 08 2014, 22:10 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 409
использую простую трансформацию.
Приведу полный текст.

Так работает:

Code:
<?xml version="1.0" encoding="windows-1251"?>
<?sap.transform simple?>
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">
  <tt:root name="ROOT" type="?"/>
  <tt:root name="CUSTOMER_DATA" type="ddic:ZMTR_CUST_XML_00"/>
  <tt:template>
    <CUSTOMER_DATA>
      <tt:loop ref=".CUSTOMER_DATA">
        <ZMTR_ST_XML>
          <tt:attribute name="Па" value-ref="CUSTNO"/>
          <tt:attribute name="г" value-ref="NAME1"/>
          <tt:attribute name="л" value-ref="TELF1"/>
        </ZMTR_ST_XML>
      </tt:loop>
    </CUSTOMER_DATA>
  </tt:template>
</tt:transform>


Результат:

<?xml version="1.0" encoding="utf-8" ?>
- <CUSTOMER_DATA>
<ZMTR_ST_XML Па="2000012" г="Иванов" л="1111" />
<ZMTR_ST_XML Па="2000013" г="Петров" л="2222" />
<ZMTR_ST_XML Па="2000014" г="Сидоров" л="3333" />
</CUSTOMER_DATA>

Кодировка все равно utf-8, хотя в трансформации явно указана <?xml version="1.0" encoding="windows-1251"?>

Добавляю одну букву в первый атрибут:

<?xml version="1.0" encoding="windows-1251"?>
<?sap.transform simple?>
<?sap.transform simple?>
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates" xmlns:ddic="http://www.sap.com/abapxml/types/dictionary" xmlns:def="http://www.sap.com/abapxml/types/defined">
<tt:root name="ROOT" type="?"/>
<tt:root name="CUSTOMER_DATA" type="ddic:ZMTR_CUST_XML_00"/>
<tt:template>
<CUSTOMER_DATA>
<tt:loop ref=".CUSTOMER_DATA">
<ZMTR_ST_XML>
<tt:attribute name="Пар" value-ref="CUSTNO"/>
<tt:attribute name="г" value-ref="NAME1"/>
<tt:attribute name="л" value-ref="TELF1"/>
</ZMTR_ST_XML>
</tt:loop>
</CUSTOMER_DATA>
</tt:template>
</tt:transform>

Ошибка:

Не удается отобразить страницу XML
Не удается просмотреть ввод XML с использованием списка стилей XSL. Исправьте ошибку и затем нажмите кнопку "Обновить"или повторите попытку позднее.


--------------------------------------------------------------------------------

Имя содержит ошибочный знак. Ошибка при обработке ресурса ''file:///D:/home1c/20141008_230955.xml''. Строка 2,Положение 24

<CUSTOMER_DATA><ZMTR_ST


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Чт, окт 09 2014, 07:41 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
CrecerRu:

Цитата:
Кодировка все равно utf-8, хотя в трансформации явно указана <?xml version="1.0" encoding="windows-1251"?>

кодировка, которая указана в трансформации относится собственно к самой трансформации, а не к получаемому выходному файлу XML

Перекодирование у вас тоже как-то странно сделано: получили бинарную таблу, выгрузили, потом перекодировали и еще раз выгрузили?
Проще всего: получили бинарную таблу - там же ее и перекодировали, и уже ее выгрузили
Можно попробовать убрать тэг кодировки из выходного файла через параметр CALL TRANSFORMATION (смотрите в хелпе его параметр OPTIONS xml_header).
Но как мне кажется тут просто ограничения простой трансформации. Жаль что по ней у сапа очень невнятный хелп.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Вс, окт 12 2014, 23:26 
Старший специалист
Старший специалист

Зарегистрирован:
Пн, май 07 2007, 09:44
Сообщения: 409
Кодер написал(а):
CrecerRu:

Цитата:
Проще всего: получили бинарную таблу - там же ее и перекодировали, и уже ее выгрузили.


А как перекодировать без сохранения?


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Пн, окт 13 2014, 08:07 
Почетный гуру
Почетный гуру
Аватара пользователя

Зарегистрирован:
Пн, мар 28 2005, 15:38
Сообщения: 1257
CrecerRu
Цитата:
А как перекодировать без сохранения?


Что-то не могу найти, как перекодировать сразу таблицу. Помню что способ был, но найти - не получается.
По простому же: сперва перегнать бинарную таблицу в xstring подходящей функцией из ФГ SCMS_CONV (в зависимости от типа таблицы, например SCMS_BINARY_TO_XSTRING). Потом у строки выполнить конверсию кодовой таблицы с помощью класса CL_ABAP_CONV_OUT_CE.
Все можно упростить, если в xslt трансформации на выходе получать сразу бинарную строку.

_________________
Там, где я рос, единственным развлечением было запоминать число «π».(С) Н. Стивенсон


Принять этот ответ
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Пн, окт 13 2014, 17:54 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, авг 08 2012, 12:57
Сообщения: 27
Увы и ах - у меня обратная проблема - никак не могу перевести из 1251 в UTF-8...
DATA: IT_Target5_XML TYPE X OCCURS 0.

DATA: gt_itab TYPE STANDARD TABLE OF HTML4096. "char2048.
DATA: gh_itab TYPE HTML4096. "char2048.

DATA: SapPageCODE LIKE TCP02-CPCODEPAGE,
KIRWindCODE LIKE TCP02-CPCODEPAGE.
DATA:
INCODE1 LIKE TCP02-CPCODEPAGE,
INCODE2 LIKE TCP02-CPCODEPAGE.

*для перекодировки в кириллицу Windows строковых элементов
KIRWindCODE = '1504'. "Код кириллицы WINDOWS в SAP
*определяем идентификаторы внутренних (в SAP) кодовых страниц
CALL FUNCTION 'SYSTEM_CODEPAGE'
IMPORTING CODEPAGE = INCODE1 " системная страница
CURRENT_DYNAMIC_CODEPAGE = INCODE2. "динамическая страница
*!!!в качестве страницы SAP берем динамическую!!!
SapPageCODE = INCODE2.

LOOP AT gt_itab ASSIGNING <fs_itab>.

gh_itab = <fs_itab>.
gs_itab = gh_itab+44(4052).
CLEAR gh_itab.
CONCATENATE '<?xml version="1.0" encoding="windows-1251"?>' gs_itab INTO gh_itab.
** <fs_itab> = gh_itab.

PERFORM AppendStrFieldToXML TABLES IT_Target5_XML
USING gh_itab.

ENDLOOP.
FORM AppendStrFieldToXML TABLES out_IT_Target_XML "IT для выгрузки в целнвой файл
USING in_StrField. "текстовое поле для записи в целевой XML-файл
************************************************************************
DATA: Smb(1) TYPE C.
DATA: Ind TYPE I.
DATA: Hex TYPE X.
DATA: LenField TYPE I.
DATA: h_String TYPE HTML4096.

h_String = in_StrField.
*замена в строке недопустимых символов для XML '"<>' на пусто
*TRANSLATE h_String USING '" < > '.
*убираем пробелы слева и справа
SHIFT h_String RIGHT DELETING TRAILING SPACE.
SHIFT h_String LEFT DELETING LEADING SPACE.

LenField = StrLen( h_String ).

DO LenField TIMES. "длина поля
CLEAR Hex.
Ind = SY-INDEX - 1.
Smb = h_String+Ind(1).
*перекодировка кириллицы
CALL FUNCTION 'SCP_TRANSLATE_CHARS'
EXPORTING
INBUFF = Smb
INCODE = SapPageCODE
OUTCODE = KIRWindCODE
IMPORTING
OUTBUFF = Smb
EXCEPTIONS
CANNOT_CONVERT = 1
FIELDS_BAD_TYPE = 2
INTERNAL_ERROR = 3
INVALID_CODEPAGE = 4.

CONCATENATE
''
Smb
INTO Hex.
Append Hex To out_IT_Target_XML.
ENDDO.
ENDFORM. " AppendStrFieldToXML

Замена 1504 на 4110 - ни чего не дает!

_________________
Специалист по решению проблем, которые сам себе создал...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Пн, окт 13 2014, 17:59 
Ассистент
Ассистент
Аватара пользователя

Зарегистрирован:
Ср, авг 08 2012, 12:57
Сообщения: 27
Забыл сказать, что исходная у меня 1500... :oops:

_________________
Специалист по решению проблем, которые сам себе создал...


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
 Заголовок сообщения: Re: Создание XML файла
СообщениеДобавлено: Ср, окт 15 2014, 09:34 
Специалист
Специалист

Зарегистрирован:
Чт, мар 25 2010, 09:02
Сообщения: 207
Как-то странно перекодируете. У вас система не юникодная? А класс CL_ABAP_CONV_OUT_CE есть? Попробуйте им перекодировать.


Принять этот ответ
Вернуться к началу
 Профиль Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 14 ] 

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


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

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


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

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