XML zu ABAP und ABAP zu XML


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

Moderatoren: Jan, Steff

XML zu ABAP und ABAP zu XML

Beitragvon Yvonne » 25.07.2006, 13: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.
Yvonne
ForumUser
 
Beiträge: 3
Registriert: 25.07.2006, 13:12
Dank erhalten: 0 mal

Sponsor

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

Beitragvon Steff » 26.07.2006, 06: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
Steff
Site Admin
 
Beiträge: 386
Registriert: 29.11.2002, 19:29
Dank erhalten: 2 mal

RE

Beitragvon Yvonne » 26.07.2006, 08: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
Yvonne
ForumUser
 
Beiträge: 3
Registriert: 25.07.2006, 13:12
Dank erhalten: 0 mal

Beitragvon ereglam » 26.07.2006, 08: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
ereglam
Top Expert
 
Beiträge: 1826
Registriert: 30.09.2004, 12:42
Wohnort: Schwalbach am Taunus
Dank erhalten: 5 mal
Ich bin: Entwickler/in

Beitragvon Yvonne » 26.07.2006, 10: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??
Yvonne
ForumUser
 
Beiträge: 3
Registriert: 25.07.2006, 13:12
Dank erhalten: 0 mal


Zurück zu ABAP® Core

  Aktuelle Beiträge   
Steuerliches Abgangsland in Verkaufsbeleg ändern
vor 4 Stunden von Julia611 0 Antw.
XML hochladen, Abschnitte suchen, Abschnitte als XML zurück
vor 3 Stunden von deejey 1 Antw.
(LKW)Bedarfsvorschau je Debitor
vor 2 Tagen von wreichelt 5 Antw.
Lieferplan, Einteilungen, Feinabrufe
vor 3 Tagen von bapimueller 0 Antw.
gelöst Smartforms Struktur rechtsbündig
vor 3 Tagen von qyurryus 3 Antw.

  Ähnliche Beiträge beta
XML --> ABAP
18.11.2005, 08:40 von Gast 0 Antw.
OLE ABAP VBA...
08.05.2006, 14:21 von zzcpak 1 Antw.
FTP aus ABAP
21.08.2006, 14:47 von Asaph 1 Antw.
ABAP-SQL Frage
03.12.2003, 19:57 von Gast 6 Antw.
Fax aus Abap versenden
08.03.2007, 15:28 von JHM 4 Antw.

 

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder