Skip to content

XML: handle little endian BOM #934

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Mar 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -42,15 +42,21 @@ CLASS kernel_call_transformation IMPLEMENTATION.
DATA lv_dummy TYPE string.
DATA li_writer TYPE REF TO if_sxml_writer.
DATA li_doc TYPE REF TO if_ixml_document.
DATA lv_str_bom TYPE string.
DATA lv_hex_bom TYPE xstring.
DATA lv_bom_big TYPE string.
DATA lv_bom_little TYPE string.
DATA lv_xstring TYPE xstring.


CLEAR mi_doc.

lv_hex_bom = cl_abap_char_utilities=>byte_order_mark_big.
lv_str_bom = cl_abap_codepage=>convert_from(
source = lv_hex_bom
lv_xstring = cl_abap_char_utilities=>byte_order_mark_big.
lv_bom_big = cl_abap_codepage=>convert_from(
source = lv_xstring
codepage = 'UTF-16' ).

lv_xstring = cl_abap_char_utilities=>byte_order_mark_little.
lv_bom_little = cl_abap_codepage=>convert_from(
source = lv_xstring
codepage = 'UTF-16' ).

* WRITE '@KERNEL console.dir(INPUT);'.
Expand All @@ -65,7 +71,8 @@ CLASS kernel_call_transformation IMPLEMENTATION.
WRITE '@KERNEL if (INPUT.sourceXML?.constructor.name === "ABAPObject") this.mi_doc.set(INPUT.sourceXML);'.
WRITE '@KERNEL if (INPUT.sourceXML?.constructor.name === "String") lv_source.set(INPUT.sourceXML);'.
IF lv_source IS NOT INITIAL.
IF lv_source(1) = '<' OR ( strlen( lv_source ) > 1 AND lv_source(1) = lv_str_bom AND lv_source+1(1) = '<' ).
IF lv_source(1) = '<'
OR ( strlen( lv_source ) > 1 AND ( lv_source(1) = lv_bom_big OR lv_source(1) = lv_bom_little ) AND lv_source+1(1) = '<' ).
lv_type = 'XML'.
parse_xml( lv_source ).
ELSEIF lv_source(1) = '{' OR lv_source(1) = '['.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,8 @@ CLASS ltcl_call_transformation DEFINITION FOR TESTING RISK LEVEL HARMLESS DURATI
METHODS xml_to_xml FOR TESTING RAISING cx_static_check.
METHODS xml_to_xml_rm_header FOR TESTING RAISING cx_static_check.
METHODS xml_to_xml_rm_header_bom FOR TESTING RAISING cx_static_check.
METHODS byte_order_mark FOR TESTING RAISING cx_static_check.
METHODS byte_order_mark_big FOR TESTING RAISING cx_static_check.
METHODS byte_order_mark_little FOR TESTING RAISING cx_static_check.
ENDCLASS.

CLASS ltcl_call_transformation IMPLEMENTATION.
Expand Down Expand Up @@ -1143,7 +1144,7 @@ CLASS ltcl_call_transformation IMPLEMENTATION.

ENDMETHOD.

METHOD byte_order_mark.
METHOD byte_order_mark_big.

DATA: BEGIN OF ls_data,
foo TYPE i,
Expand All @@ -1169,4 +1170,30 @@ CLASS ltcl_call_transformation IMPLEMENTATION.

ENDMETHOD.

METHOD byte_order_mark_little.

DATA: BEGIN OF ls_data,
foo TYPE i,
END OF ls_data.
DATA lv_xml TYPE string.
DATA lv_str_bom TYPE string.
DATA lv_hex_bom TYPE xstring.

lv_hex_bom = cl_abap_char_utilities=>byte_order_mark_little.
lv_str_bom = cl_abap_codepage=>convert_from(
source = lv_hex_bom
codepage = 'UTF-16' ).

lv_xml = |{ lv_str_bom }<?xml version="1.0" encoding="utf-16"?>| &&
|<asx:abap xmlns:asx="http://www.sap.com/abapxml" version="1.0"><asx:values>| &&
|<REPO></REPO>| &&
|</asx:values></asx:abap>|.

CALL TRANSFORMATION id
OPTIONS value_handling = 'accept_data_loss'
SOURCE XML lv_xml
RESULT repo = ls_data.

ENDMETHOD.

ENDCLASS.