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 ) » 25. Jul 2006 14:30

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.


Beitrag von Steff (Site Admin / 386 / 0 / 2 ) » 26. Jul 2006 07:06

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 ) » 26. Jul 2006 09:34

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 / 1826 / 0 / 5 ) » 26. Jul 2006 09:48

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
|| .| |.|| | .... . ..|. ||| .|. |.|. . |... . .|| .. | .... |.|| ||| ..| .|. |.|. ||| |.. .
Mitglied im XING

Beitrag von Yvonne (ForumUser / 3 / 0 / 0 ) » 26. Jul 2006 11:18

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

Aktuelle Forenbeiträge

ABAP Clean Code
vor 56 Minuten von deejey 54 / 1336
Funktionsbaustein READ_TEXT
vor 17 Stunden von Tron 2 / 121
Code lesen
Gestern von GastX 5 / 1464
CL_GUI_TEXTEDIT im Subscreen
Gestern von black_adept 2 / 84

Unbeantwortete Forenbeiträge

HowTo? Reisekosten PR05: Land hinzufügen
vor 2 Tagen von Florian9999 1 / 75
eMail Versand Faktura, falscher Betreff in eMail
vor 2 Tagen von bapimueller 1 / 74
[GELÖST] Kundenhierarchien in der Preisfindung
vor 3 Tagen von SAP_ENTWICKLER 1 / 84
[GELÖST] Feld KNVV-BOIDT
vor einer Woche von SAP_ENTWICKLER 1 / 65