Текущее время: Пн, июн 23 2025, 08:15

Часовой пояс: 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 часа


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

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


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

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