XML Block einfügen


Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV

Moderatoren: Jan, Steff

XML Block einfügen

Beitragvon Prego » 23.05.2018, 09:04

Hallole zusammen,

mal wieder das leidige Thema XML. Folgende Anforderung wurde an mich herangetragen: Eine XML exportieren die jeden Werkstoff (Dokumentenart) im System + diverse Klassifizierungsmerkmale enthält. Alles soweit kein Thema und mit ixml wunderbar zu bewerkstelligen.

Aber das XML muss zusätzlich einen Bereich mit Metadaten (Umrechnungen, div. Härtegrade....) enthalten. Dieser Bereich ist immer gleich. Wäre auch kein Thema wenn nicht meine Faulheit und die Größe dieses Bereiches wäre. Es handelt sich dabei um ca. 270 zusätzliche Knoten (über 1300 Zeilen) in dem Stil:

Code: Alles auswählen
<PropertyDetails id="FatigueDuctExp_48">
  <Name>FatigueDuctExp</Name>
    <Units>
      <Unitless/>
    </Units>
</PropertyDetails>
<PropertyDetails id="FatigueDuctExp2_49">
  <Name>FatigueDuctExp2</Name>
   <Units>
    <Unitless/>
   </Units>
</PropertyDetails>
<PropertyDetails id="FatigueDuctExp12_50">
  <Name>FatigueDuctExp12</Name>
   <Units>
    <Unitless/>
   </Units>
</PropertyDetails>
<PropertyDetails id="CyclicYieldStrength_51">
  <Name>CyclicYieldStrength</Name>
    <Units description="Newton pro Quadratmillimeter" name="N/mm^2(MPa)">
     <Unit>
       <Name>N/mm^2(MPa)</Name>
     </Unit>
    </Units>
</PropertyDetails>
<PropertyDetails id="CyclicStrengthCoeff_52">
  <Name>CyclicStrengthCoeff</Name>
    <Units description="Newton pro Quadratmillimeter" name="N/mm^2(MPa)">
      <Unit>
       <Name>N/mm^2(MPa)</Name>
      </Unit>
   </Units>
</PropertyDetails>



Nun war meine Idee diesen Bereich in einen Smartformstext zu speichern und den dann einfach mit ins XML zu schreiben. Aber wie kann ich nach der eigentlichen Datensektion noch den Inhalt einer TLINE-Tabelle vor dem Ende-Tag des XMLs einfügen. Keine der Methoden im ixml scheint mir dafür geeignet.

Für Eure Hilfe bin ich wie immer sehr Dankbar.

Beste Grüße
Jens
Prego
ForumUser
 
Beiträge: 87
Registriert: 18.07.2005, 15:01
Dank erhalten: 1 mal

Sponsor

Alte ABAP-Entwicklerweisheit: Weißt du weder aus noch ein, baust du einen BADI ein

Re: XML Block einfügen

Beitragvon sapnup » 23.05.2018, 14:42

Hallo Jens, mein Ansatz wäre eine kleine XSL-Transformation (F1 auf CALL TRANSFORMATION und google nach XSLT) zu schreiben, die deine einzufügende XML an die gewünschten Knoten hängt. Die XSLT-Syntax habe ich auf Anhieb nicht parat, sie lässt sich aber nach meiner Erfahrung leicht zusammengoogeln. Falls nicht kannst du ja nochmal rückfragen.

Gruß
sapnup
ForumUser
 
Beiträge: 37
Registriert: 14.06.2016, 07:16
Dank erhalten: 11 mal
Ich bin: Entwickler/in

Re: XML Block einfügen

Beitragvon Prego » 23.05.2018, 15:17

Hallole,

ich hasse XSLT. Aber ich fürchte das ich da nicht herum kommen werde. Ich schaue mir das Morgen mal an und melde mich auf jeden Fall wieder.
Vielen Dank schon mal für den Tipp.

Grüße
Jens
Prego
ForumUser
 
Beiträge: 87
Registriert: 18.07.2005, 15:01
Dank erhalten: 1 mal

Re: XML Block einfügen

Beitragvon Prego » 24.05.2018, 12:53

Ok, es scheint das ich da doch etwas Hilfe brauche. Ich hab mir jetzt folgende XSLT zusammengegoogelt. Sprich, ich habe meine Material.xml und meine Meta.xml die in einem neuen Document unter dem Tag MatML_Doc zusammengeführt werden sollen.

Code: Alles auswählen
<?xml version="1.0" ?>
<xsl:transform
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="/MatML_Doc">
        <xsl:copy>
            <xsl:copy-of select="document('Material.xml')" />
            <xsl:copy-of select="document('Meta.xml')" />
        </xsl:copy>
    </xsl:template>
</xsl:transform>


Aber wie rufe ich das auf? Aus der SAP-Doku werde ich nicht wirklich schlau wie ich jetzt die 2 Quelldaten da mitgeben soll.

Grüße
Jens
Prego
ForumUser
 
Beiträge: 87
Registriert: 18.07.2005, 15:01
Dank erhalten: 1 mal

Re: XML Block einfügen

Beitragvon Legxis » 24.05.2018, 13:03

Prego hat geschrieben:Aber wie rufe ich das auf? Aus der SAP-Doku werde ich nicht wirklich schlau wie ich jetzt die 2 Quelldaten da mitgeben soll.

Code: Alles auswählen
    CALL TRANSFORMATION (name)
              SOURCE (bezeichnung) = table1
                     (bezeichnung) = table2
              RESULT XML (out).
Ich bin Neuling und für jede Hilfe, Kritik, diverse Programmverbesserungen/-optimierung und schöne Codebeispiele dankbar^^
( SAP ECC 6.0, NetWeaver 7.0, ohne unicode, ohne support packages )

Für diese Nachricht hat Legxis einen Dank bekommen :
Prego
Legxis
ForumUser
 
Beiträge: 50
Registriert: 12.01.2018, 08:59
Wohnort: Köln
Dank erhalten: 10 mal
Ich bin: Student/in

Re: XML Block einfügen

Beitragvon Prego » 24.05.2018, 13:58

Sorry, ich versteh es nicht

Ganz konkret 2 XML

XML1
Code: Alles auswählen
<?xml version="1.0" encoding="utf-8"?>
<Material>
  <BulkDetails/>
</Material>                                                                                                                                                                                      
<Material>
  <BulkDetails/>
</Material>
 


XML2
Code: Alles auswählen
<?xml version="1.0" encoding="utf-8"?>
<MetaDaten>
 <Properties/>
</MetaDaten>
 


sollen in diese XML zusammengeführt werden.
Code: Alles auswählen
<?xml version="1.0" encoding="utf-8"?>
<MatML_Doc>
  <Material>
    <BulkDetails/>
  </Material>                                                                                                                                                                                      
  <Material>
    <BulkDetails/>
  </Material>  
  <MetaDaten>
    <Properties/>
  </MetaDaten>      
</MatML_Doc>
 


die 2 Quellxml habe ich sowohl als xstring table und als Referenz auf die iXml-Document vorliegen. Aber egal mit welchen Parametern ich die Transformation aufrufe, kommt entweder eine leeres File oder absoluter Käse raus:

zB:
Code: Alles auswählen
<?xml version="1.0" encoding="utf-8"?>
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48TWF0ZXJpYWw+PEJ1bGtEZXRh
aWxzLz48L01hdGVyaWFsPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA==PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz48TWV0YURhdGVuPjxCdWxrRGV0
YWlsczIvPjwvTWV0YURhdGVuPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA==                


Meine Transformation schaut so aus, wobei Material und Meta die Übergabeparameter sein sollen?
Code: Alles auswählen
<?xml version="1.0" ?>
<xsl:transform
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    version="1.0">
    <xsl:template match="/MatML_Doc">
        <xsl:copy>
            <xsl:copy-of select='Material' />
            <xsl:copy-of select='Meta' />
        </xsl:copy>
    </xsl:template>
</xsl:transform>


Der Aufruf wie folgt:
Code: Alles auswählen
  call TRANSFORMATION zmerge_xml
  source   Material = l_xml_table_mat
           Meta     = l_xml_table_meta
  RESULT XML l_xml_table.
 


XSLT und ich werden definitiv keine Freunde mehr.
Prego
ForumUser
 
Beiträge: 87
Registriert: 18.07.2005, 15:01
Dank erhalten: 1 mal

Re: XML Block einfügen

Beitragvon sapnup » 24.05.2018, 16:16

Hi Jens,

- wenn dein <Metadaten> Block immer gleich ist und
- wenn du deine <Material> Knoten unter einen gemeinsamen Knoten bringen kannst (zur not mit ein paar string-operationen)

kannst du sowas hier probieren:

Report:
Code: Alles auswählen
REPORT  Z_XSLT.

data: lv_in   TYPE string,
         lv_out TYPE string.

lv_in = '<someNode><Material><BulkDetails/></Material><Material><BulkDetails/></Material></someNode>'.

CALL TRANSFORMATION Z_TRANFORMATION
       SOURCE XML lv_in     " lv_in kann auch vom typ xstring sein
       RESULT XML  lv_out.
 


Transformation:
Code: Alles auswählen

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:sap="http://www.sap.com/sapxsl" version="1.0">

  <xsl:strip-space elements="*"/>

  <xsl:template match="/">

    <MatML_Doc>

        <xsl:copy-of select="someNode/node()"/>
        <xsl:call-template  name='METADATEN' />

    </MatML_Doc>

  </xsl:template>

  <xsl:template name = "METADATEN">
  <!-- in diesem Template sind deine Metadaten hardgecodet(/gecopypastet), weil die eh immer gleich sind (oder?) -->
      <MetaDaten>

          <Properties/>

      </MetaDaten>

  </xsl:template>

</xsl:transform>

 


Aber das ist ziehmlich dirty, deshalb sag bitte niemandem, dass es von mir kommt :cry:

EDIT:

Auf den zweiten Blick: wenn die Metadaten-XML und die Material-XML jedes mal einfach an einander geklatscht und das Ergebnis in einen <MatML_Doc> Knoten verpackt werden muss, könntest du dir die Plagerei auch sparen und das ganze als strings behandeln, sie zerschnippeln und wieder zusammensetzen.

Wäre zwar noch dreckiger, würde aber ...

Für diese Nachricht hat sapnup einen Dank bekommen :
Prego
sapnup
ForumUser
 
Beiträge: 37
Registriert: 14.06.2016, 07:16
Dank erhalten: 11 mal
Ich bin: Entwickler/in

Re: XML Block einfügen

Beitragvon Prego » 25.05.2018, 06:51

Hehe,

perfetto. Vielen lieben Dank Euch beiden. Der letzte Hinweis von SAPNUP (er hat's gesagt, er hat's gesagt) war das fehlende Puzzlestückchen.

Gruß
Jens

PS: Hab ich schon erwähnt das XSLT und ich keine Freunde mehr werden :D
Prego
ForumUser
 
Beiträge: 87
Registriert: 18.07.2005, 15:01
Dank erhalten: 1 mal


Zurück zu ABAP® Core

  Aktuelle Beiträge   
Ausgangszeugnis
vor 9 Stunden von HH_ABAP 2 Antw.
Editierbarer ALV - Zeilen einfügen verbieten
vor 9 Stunden von ewx 3 Antw.
gelöst Dynamic Cast von Superclass auf Subclass
vor 11 Stunden von AdrianSchm 2 Antw.
gelöst PLMKB: Spalte "Untere Grenze"
vor 12 Stunden von DeathAndPain 1 Antw.
PDF Formular
vor 12 Stunden von DeathAndPain 1 Antw.

  Ähnliche Beiträge beta
Selection-Screen Block komplett ausblenden (NO-DISPLAY)
28.03.2006, 09:32 von JHM 5 Antw.
Weiteres Feld einfügen
02.03.2007, 16:13 von JHM 1 Antw.
gelöst Zeile einfügen GUI_DOWNLOAD FB
25.07.2017, 14:14 von Cargo2 2 Antw.
Spalte in eine Tabelle einfügen
08.10.2004, 13:04 von Gast 4 Antw.
Bild von SAP via OLE ins Word Dokument einfügen?
16.01.2006, 13:08 von Nicolas_ 0 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder