2013-05-08 2 views
5

알 수없는 구조의 XML을 가지고 있으며 XML에있는 ABAP 구조의 내용을 "어떻게 든"얻으려면 ST (Simple Transformation)를 적용하려고합니다.알 수없는 XML을 사용하는 SAP 단순 변환

report ztbu_st_with_copy. 

data: lf_xml type string. 
concatenate '<tab><obj>' 
       '<id>A1</id>' 
       '<first>Erste</first>' 
       '<second>Zweite</second>' 
      '</obj><obj>' 
       '<id>B2</id>' 
       '<item>' 
       '<here>Tady</here>' 
       '<there>Tam</there>' 
       '</item>' 
      '</obj>' 
      '</tab>' 
     into lf_xml. 

types: begin of ys_obj, 
     id type string, 
     rest type string, 
     end of ys_obj, 
     yt_obj type standard table of ys_obj. 

data: lt_obj type yt_obj. 

call transformation ztbu_st_copy_test 
    source xml lf_xml 
    result root = lt_obj. 

uline. 

data: ls_obj like line of lt_obj. 
loop at lt_obj into ls_obj. 
    write:/sy-tabix, ls_obj-id. 
endloop. 

uline. 

나는 다음과 같은 한 ST 변환 ZTBU_ST_COPY_TEST (위라는 일) :

<?sap.transform simple?> 
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"> 

<tt:root name="ROOT"/> 

<tt:template> 
    <tab> 
    <tt:loop ref=".ROOT" name="obj"> 
     <obj> 
     <id> 
      <tt:value ref="$obj.ID" /> 
     </id> 
     <tt:skip /> 
     </obj> 
    </tt:loop> 
    </tab> 
</tt:template> 

</tt:transform> 

이 지금은 잘 작동하고로 ID를 가져올 것이다 지금 내가 시험 보고서 다음 한

테이블 LT_OBJ의 필드 그러나 나머지는 <TT:SKIP>의 사용으로 인해 무시됩니다. 내 목표는 나머지 XML 문서 (이러한 첫 번째, 두 번째, 여기, 또는 임의의 XML)를 "some"형식의 필드 REST에 넣는 것입니다. 아마도 STRING 변수에 저장된 거친 XML로 생각할 것입니다.

나는 더 똑똑한 것으로 <TT:SKIP>을 대체해야한다는 것을 알고 있지만, 그게 무엇인지 알아낼 수는 없다 ... 어떤 생각 이니?

사이드 노트 : 그렇습니다. ST 대신 XSLT 또는 다른 것을 사용하는 것이 좋겠지 만, 선택의 여지가 없으며 ST를 사용하여 만들어야합니다.

+0

나는 "알 수없는 XML"이라고 부르지 않을 것입니다. XML이 으로 시작하고 그 안에 이라는 숫자가 있으며 각각은 및 기타 알 수없는 요소가 있다고 가정합니다. 추측하는 것이 안전한가요? – Eric

+0

그래,이 가정, , 알려져 안전합니다,하지만 난 나머지 것들을 다하고있어, 그리고 그들은 진정으로 알 수없는 ... –

답변

0

SAP 개발자 라이센스가있는 경우 라이센스와 함께 제공되는 SDK를 통해 매우 가능합니다. 일부 샘플에 관심이 있다면 VB.NET을 사용하여 비슷한 내용을 작성했습니다.

+0

참고 사항을 참조하십시오 : 내가 ST와 함께 갈 필요가, 나는 다른 선택권이 없다.- 무료 스타일 XML 처리를 할 수 있다면 ABAP 쪽에서 잘 지낼 수 있으며 괜찮을 것입니다. 하지만 ST에서이 작업을 수행해야합니다. –

0

ST는 두 가지 방법으로 사용할 수 있기 때문에 제약이 있습니다 (< -> xml). 그들이 빠르기 때문에 그들은 위대합니다. 그러나 ABAP 값을 XML 노드에 매핑하므로 많은 옵션이 없습니다. 나는 당신이 ST와 함께 할 수 없다고 믿습니다. SXML이 당신의 시나리오에 가장 적합 할 것입니다.

0

프록시 서비스를 위해 생성 된 변환에서 원시 XML을 가져 오는 방법을 발견했습니다. 예를 들어 변환은 다음과 같습니다.

<?sap.transform simple?> 
<tt:transform xmlns:tt="http://www.sap.com/transformation-templates"> 

    <tt:root name="ROOT"/> 

<tt:template> 
    <tab> 
     <tt:loop name="obj" ref=".ROOT"> 
     <obj tt:ap="y" tt:option="allNsps,noRootAttr" tt:value-ref="$obj.REST"/> 
     </tt:loop> 
    </tab> 
    </tt:template> 

</tt:transform> 

id는 구문 분석하지 않습니다. obj 태그 내의 모든 내용은 REST에 저장됩니다. 또한 조각의 주변 태그를 알아야하기 때문에 XML을 완전히 알 수 없습니다. (이 경우 obj)

REST의 유형은 XSDANY()이어야합니다. 당신의 코드에서 :

TYPES: BEGIN OF ys_obj, 
     id TYPE string, 
     rest TYPE xsdany, 
     END OF ys_obj, 
     yt_obj TYPE STANDARD TABLE OF ys_obj. 

는 클래스 cl_proxy_service을 사용할 수 있습니다 cstrings에 xstrings 변환합니다. 귀하의 쓰기 코드 :

LOOP AT lt_obj INTO ls_obj. 
    WRITE:/sy-tabix, ls_obj-id, cl_proxy_service=>xstring2cstring(ls_obj-rest). 
ENDLOOP. 

변환의 중요한 비트는 tt:option 속성입니다. 키워드 문서에서 찾아 볼 수 있습니다.