imp написал:
Насколько мне не изменяет склероз, в XML-документе должен быть один корневой элемент, а в твоем файле его не видно.
Почему же тогда вот такое преобразование работает отлично в обе стороны:
Code:
REPORT z_xml_transform_test.
DATA: l_response TYPE string .
DATA: BEGIN OF lwa_courses,
vname(1000),
vnom(5),
vcurs(15),
vcode(5),
vchcode(20),
END OF lwa_courses,
lt_courses LIKE STANDARD TABLE OF lwa_courses WITH HEADER LINE .
lwa_courses-vname = 'TEST1'.
lwa_courses-vnom = '01'.
lwa_courses-vcurs = '1'.
lwa_courses-vcode = '12345'.
lwa_courses-vchcode = '1234567890' .
APPEND lwa_courses TO lt_courses .
lwa_courses-vname = 'TEST2'.
lwa_courses-vnom = '02'.
lwa_courses-vcurs = '2'.
lwa_courses-vcode = '12345'.
lwa_courses-vchcode = '1234567890' .
APPEND lwa_courses TO lt_courses .
CALL TRANSFORMATION zcbr_cur
SOURCE curr_tab = lt_courses[]
RESULT XML l_response .
refresh lt_courses .
CALL TRANSFORMATION zcbr_cur
SOURCE XML l_response
RESULT curr_tab = lt_courses[] .
Подгоняю l_response под такой же вид в проге получения курсов валют - падает в дамп.
imp написал:
По твоей ссылке на сайт ЦБ РФ возвращается ошибка.
Эксплорером туда ломиться бесполезно - будет ошибка. А так - все отлично работает:
Code:
DATA: lr_client TYPE REF TO if_http_client,
lr_response TYPE REF TO if_http_response,
lr_request TYPE REF TO if_http_request,
l_request TYPE string,
l_response TYPE string,
lp_xresponse TYPE xstring .
DATA: ltb_report TYPE TABLE OF string WITH HEADER LINE .
CALL METHOD cl_http_client=>create_by_destination
EXPORTING
destination = 'CBR_CURRENCY'
IMPORTING
client = lr_client
EXCEPTIONS
destination_not_found = 1
internal_error = 2
argument_not_found = 3
destination_no_authority = 4
plugin_not_active = 5
OTHERS = 6.
CHECK sy-subrc = 0.
lr_request = lr_client->request .
* Настройка запроса
CALL METHOD lr_request->if_http_entity~set_content_type
EXPORTING
content_type = 'text/xml'.
CALL METHOD lr_request->set_header_field
EXPORTING
name = 'SOAPAction'
value = 'http://web.cbr.ru/GetCursOnDateXML'.
READ REPORT 'ZBE_CBR_XMLREQUEST' INTO ltb_report .
IF sy-subrc > 0 .
MESSAGE e089 .
ENDIF.
DATA: lb_report(2), l_len TYPE i, lc_len(4) .
LOOP AT ltb_report .
lb_report = ltb_report .
IF lb_report EQ '*-' .
SHIFT ltb_report LEFT BY 2 PLACES .
CONCATENATE l_request ltb_report cl_abap_char_utilities=>cr_lf INTO l_request SEPARATED BY space .
MODIFY ltb_report .
ELSE.
DELETE ltb_report .
ENDIF.
ENDLOOP .
DATA: lb_request2(1000) .
SEARCH l_request FOR '<?xml version="1.0" encoding="utf-8"?>' .
MOVE l_request+sy-fdpos TO lb_request2 .
l_len = STRLEN( lb_request2 ) ."l_request ).
WRITE l_len TO lc_len .
REPLACE: 'P_DATE' IN l_request WITH '2008-06-11T00:00:00Z' . "06-11T10:00:00+03:00'. "'11.06.2008',
lr_request->set_cdata( l_request ) . "ltp_request ) .
l_request = lr_request->get_cdata( ).
* Отправка запроса
CALL METHOD lr_client->send
* exporting timeout = timeout
EXCEPTIONS http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4.
CHECK sy-subrc = 0.
* Получение ответа сервера
CALL METHOD lr_client->receive
EXCEPTIONS
http_communication_failure = 1
http_invalid_state = 2
http_processing_failed = 3
OTHERS = 4.
CHECK sy-subrc = 0.
lr_response = lr_client->response .
l_response = lr_response->get_cdata( ).
* Закрытие соединения
CALL METHOD lr_client->close
EXCEPTIONS
http_invalid_state = 1
OTHERS = 2.
CHECK NOT l_response IS INITIAL .
Отчет 'ZBE_CBR_XMLREQUEST' (текст запроса, содран с сайта ЦБ РФ - там есть инструкция):
Code:
**POST /DailyInfoWebServ/DailyInfo.asmx HTTP/1.1
**Host: www.cbr.ru
**Content-Type: text/xml; charset=utf-8
**Content-Length: length
**SOAPAction: "http://web.cbr.ru/GetCursOnDateXML"
**
**<?xml version="1.0" encoding="utf-8"?>
*-<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
*- <soap:Body>
*- <GetCursOnDateXML xmlns="http://web.cbr.ru/">
*- <On_date>P_DATE</On_date>
*- </GetCursOnDateXML>
*- </soap:Body>
*-</soap:Envelope>