XML zu ABAP und ABAP zu XML

Alles rund um die Sprache ABAP®: Funktionsbausteine, Listen, ALV
5 Beiträge • Seite 1 von 1
5 Beiträge Seite 1 von 1

XML zu ABAP und ABAP zu XML

Beitrag von Yvonne (ForumUser / 3 / 0 / 0 ) »
Hallo Forum,

ich habe analog zu dem u. a. Report entwickelt.
Das upload des XML Dokumentes und download funktionieren soweit.

Meine Frage : Wie kann ich das Dokument füllen bzw. ändern?

Es ist mit Sicherheit für einige von Euch sehr einfach aber mir fehlt leider das Abap Objects Wissen.

Danke im Voraus!

Code:

* BCCIIXMLT1 - sample program
*
* This sample program shows how to read an XML document from a file
* in the frontend's file system, parse the document into a DOM
* representation and display the content as a list.
* Additionally the DOM representation is rendered back into an XML
* stream and stored as an output XML file on the frontend machine.
*
* This sample program uses ABAP tables to represent the XML input
* and output streams. See BCCIIXMLT2 for a sample using strings.
*

report BCCIIXMLT1 message-id bcciixmlt3_msg line-size 1000.

include bcciixml_decl.
include bcciixml_impl.

*- test program --------------------------------------------------------
start-of-selection.

*-- data
data: piXML type ref to if_ixml,
pDocument type ref to if_ixml_document,
pStreamFactory type ref to if_ixml_stream_factory,
pIStream type ref to if_ixml_istream,
pParser type ref to if_ixml_parser,
pNode type ref to if_ixml_node,
pText type ref to if_ixml_text,
string type string,
count type i,
index type i,
totalSize type i,
dsn(40) type C,
xstr type xstring.

*-- read the XML document from the frontend machine
types: begin of xml_line,
data(256) type X,
end of xml_line.
data: xml_table type table of xml_line.
data: filename like rlgrap-filename.
filename = '\\p34218\public\orders2.xml'.
CALL FUNCTION 'WS_UPLOAD'
EXPORTING
FILENAME = filename
FILETYPE = 'BIN'
IMPORTING
FILELENGTH = totalSize
TABLES
DATA_TAB = xml_table
EXCEPTIONS
OTHERS = 11
.
if sy-subrc <> 0.
message w000.
exit.
endif.


*-- create the main factory
pixml = cl_ixml=>create( ).

*-- create the initial document
pDocument = pixml->create_document( ).

*-- create the stream factory
pStreamFactory = pixml->create_stream_factory( ).

*-- create an input stream for the table
pIStream = pStreamFactory->create_istream_itable( table = xml_table
size = totalSize ).

*-- create the parser
pParser = piXML->create_parser( stream_factory = pStreamFactory
istream = pIStream
document = pDocument ).

*-- parse the stream
if pParser->parse( ) ne 0.
if pParser->num_errors( ) ne 0.
count = pParser->num_errors( ).
write: count, ' parse errors have occured:'.
data: pParseError type ref to if_ixml_parse_error,
i type i.
index = 0.
while index < count.
pParseError = pParser->get_error( index = index ).
i = pParseError->get_line( ).
write: 'line: ', i.
i = pParseError->get_column( ).
write: 'column: ', i.
string = pParseError->get_reason( ).
write: string.
index = index + 1.
endwhile.
endif.
endif.

*-- we don't need the stream any more, so let's close it...
call method pIStream->close( ).
clear pIStream.


*-- render the DOM back into an output stream/internal table
data: pOStream type ref to if_ixml_ostream.
pOStream = pStreamFactory->create_ostream_itable( table = xml_table ).
call method pDocument->render( ostream = pOStream ).
*-- how many bytes were written to the table?
totalSize = pOStream->get_num_written_raw( ).


*-- write the XML document back to the frontend
concatenate filename '.out' into filename.
condense filename no-gaps.
CALL FUNCTION 'WS_DOWNLOAD'
EXPORTING
BIN_FILESIZE = totalSize
FILENAME = filename
FILETYPE = 'BIN'
TABLES
DATA_TAB = xml_table
EXCEPTIONS
OTHERS = 11
.
IF SY-SUBRC <> 0.
ENDIF.



*-- print the whole DOM tree as a list...
pNode = pDocument.
perform print_node using pNode.





*---------------------------------------------------------------------*
* FORM print_node *
*---------------------------------------------------------------------*
* ........ *
*---------------------------------------------------------------------*
form print_node using value(pNode) type ref to if_ixml_node.
data: indent type i.
data: pText type ref to if_ixml_text.
data: string type string.

indent = pNode->get_height( ) * 2.

case pnode->get_type( ).
when if_ixml_node=>co_node_element.
string = pNode->get_name( ).
write: at /indent '<', string, '> '.
when if_ixml_node=>co_node_text.
pText ?= pNode->query_interface( ixml_iid_text ).
if pText->ws_only( ) is initial.
string = pNode->get_value( ).
write: at /indent string.
endif.
endcase.

pNode = pNode->get_first_child( ).
while not pNode is initial.

perform print_node using pNode.
pNode = pNode->get_next( ).

endwhile.

endform.

gesponsert
Stellenangebote auf ABAPforum.com schalten
kostenfrei für Ausbildungsberufe und Werksstudenten


Beitrag von Steff (Site Admin / 386 / 0 / 1 ) »
Hi,

am ehesten kannst Du Dir mit ein paar Beispielimplementierungen weiterbehelfen, z.B. Report CKECP_EXPORT_MODEL.

Du kannst auch in der SE24 fuer die Klasse 'cl_ixml' einen Verwendungsnachweis machen, der Dir einige Implmentierungen liefert. Damit muesstest Du dann weiterkommen.

Gruss,
Steff

RE

Beitrag von Yvonne (ForumUser / 3 / 0 / 0 ) »
Hi,
danke für Deine Antwort, ich war gestern am verzweifeln.

Ich habe eine Methode über die se24 gefunden, die frage ist jetzt die,
kann ich die CHANGE_XML_ENCODING benutzen um ein XML-Formular zu füllen
und es wieder runter zu laden?

Eine andere möglichkeit wäre, alles manuell zu machen. Aber da bin ich mir nicht sicher ob ich am Ende in die xml-table zurück schreiben kann.

Nochmals vielen Dank für die tolle Unterstützung

Gruss

Yvonne

Beitrag von ereglam (Top Expert / 1829 / 2 / 7 ) »
Hallo Yvonne,

schau Dir mal die Klasse CL_XML_DOCUMENT an.
Dort hast Du die Methoden IMPORT_FROM_FILE und EXPORT_TO_FILE zum Laden und Schreiben einer XML-Datei.
Das DOM (Daten) bearbeitet man über das Attribut M_DOCUMENT, wo die Daten in Form von einzelnen, hierarchigen Knoten abgebildet werden.

PS:
für meinen damaligen Anwendungsfall habe ich eine eigene Klasse abegeleitet, in der ich dann obige Methoden überschrieben habe um den Aufbau des DOM steuern zu können.
Gruß
Ereglam


May the Force be with your code
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .

Beitrag von Yvonne (ForumUser / 3 / 0 / 0 ) »
https://www.sdn.sap.com/irj/sdn/weblogs ... b/wlg/2657

Hier gibts ein Lösungsvorschlag!

Nach dem ich aber dieses Attribut eingebaut habe:

*An attribute can be add easily using the method set_attribute of the *element node.
l_rc = l_element_airline->set_attribute( name = 'code' value = 'LH401' ).

wird ein Dump erzeugt! Angeblich wurde versucht eine Null zu übergeben??

Seite 1 von 1

Vergleichbare Themen

5
Antw.
9998
Views
Kundeneigene ABAP-Muster Vorlage im ABAP-Editor anlegen
von Stentor » 19.07.2005 11:10 • Verfasst in Basis
3
Antw.
3427
Views
OLE und ABAP: Aufruf von Excel-VBA Prozeduren aus ABAP
von OnkelSAP » 26.05.2010 09:45 • Verfasst in ABAP Objects®
2
Antw.
3015
Views
ABAP Objects oder ABAP Referenz
von Gast » 23.06.2005 15:52 • Verfasst in ABAP® für Anfänger
6
Antw.
4602
Views
ABAP Workbench und ABAP Dictionary - für Einsteiger
von schnonus » 03.04.2008 10:39 • Verfasst in ABAP® für Anfänger
3
Antw.
15616
Views
ABAP 7.02 - Neues Feature - Pragmas in ABAP
von foessleitnerj » 09.01.2013 17:02 • Verfasst in Tips + Tricks & FAQs

Über diesen Beitrag


Unterstütze die Community und teile den Beitrag für mehr Leser und Austausch

Newsletter Anmeldung

Keine Beiträge verpassen! Wöchentlich versenden wir lesenwerte Beiträge aus unserer Community.
Die letzte Ausgabe findest du hier.
Details zum Versandverfahren und zu Ihren Widerrufsmöglichkeiten findest du in unserer Datenschutzerklärung.

Unbeantwortete Forenbeiträge

Zwischensumme Adobe Forms
vor 3 Tagen von Lucyalison 1 / 71
Group Items auf einer Filterbar
vor einer Woche von Bright4.5 1 / 111
tRFC Transaktionen SM58
vor 4 Wochen von A6272 1 / 141