[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2008
    Beiträge
    70

    XML-INTO %HANDLER

    Hi *ALL,

    ich fall mal mit der Tür ins Haus.


    Ich versuche seit einigen Tagen ein kleines Testprogramm mit Free-RPG zu schreiben, dass XML-Dateien ausliest und die Daten auf unserer i-Series verarbeitet.
    Dank ausgiebiger Nutzung dieses Forums und des IBM Handbuchs, ist es mir inzwischen gelungen, eine XML-Datenstruktur mit nur einem Element auszulesen.
    Jetzt scheitere ich jedoch am Auslesen eines komplexeren XML-Files. Damit ich Fehler meinerseits (XML-Dokument bzw. eigene Felddefintionen) vermeide, habe ich erstmal den Beispielcode (unterstes Beispiel: "Parsing an unknown number of XML Elements ...) abgetippt und meine XML-File nach dem gleichen Schema aufgebaut.


    Das Problem ist jetzt, obwohl der Code fast 1:1 mit dem IBM Beispielcode übereinstimmt (anderer Path, logOutputError weggelassen und Groß-Kleinschreibung ignoriert), erhalte ich immer beim Umwandeln die folgenden Fehlermeldungen: 1. "RNF5352 Der Prototyp PARTHANDLER, der von %HANDLER für XML-INTO angegeben wurde, ist keine gültige XML-INTO-Prozedur."
    2. "RNF7701 Datenstruktur PARTS ist für die Operation nicht zulässig."


    Auch ein Kollege, der bereits seit einigen Jahren RPG programmiert (ich erst seit ca. 6 Monaten), wird nicht mehr schlau daraus und ist am Ende mit seinem Latein.


    Hier noch mein Code. Vielen Dank schonmal im Voraus für eure Hilfe.



    Code:
    FTEST04P   UF A E             DISK            
    F*                                            
    D OPTIONS         S            100A                           
    D ALLOK           S               N                           
    D                                                             
    D PARTHANDLER     PR            10I 0                         
    D   OK                            N                           
    D   PARTS                             LIKEREC(PARTREC) DIM(10)
    D   NUMRECS                     10U 0                         
    /free                                                       
    OPTIONS = 'PATH=PARTS/PART CASE=ANY DOC=FILE';         
    ALLOK = *ON;                                           
     
    XML-INTO %HANDLER(partHandler : ALLOK)                 
                      %XML('/SPM/3856330.XML' : OPTIONS);
     
    IF NOT ALLOK;                                          
     
    ENDIF;                                                 
     
    /end-free       
     
    C                   SETON                                        LR
     
    PpartHandler      B                                           
    D                 PI            10I 0                         
    DOK                              1N                           
    DPARTS                                LIKEREC(PARTREC) DIM(10)
    DNUMRECS                        10U 0                         
    DI                S             10I 0                         
    DXMLRECNUM        S             10I 0 STATIC INZ(0)           
    D*                                                            
    /FREE                                                        
    FOR I = 1 TO NUMRECS;                                     
      XMLRECNUM = XMLRECNUM + 1;                          
      WRITE(E) PARTREC PARTS(I);                          
     
      IF %ERROR;                                          
         OK = *OFF;                                       
      ENDIF;                                              
    ENDFOR;                                                   
    RETURN 0 ;                                               
    /END-FREE                                                    
    PpartHandler      E                                           


    Die physische Datei (Name TEST04P) sieht so aus:

    Code:
    A          R PARTREC
    Code:
    A*         **********           
    A            ID              10P 0
    A            QTY           10P 0
    A            COST           7P 2

  2. #2
    Registriert seit
    Jan 2001
    Beiträge
    835
    HI,

    mal eine kleine Frage

    Müsste der Aufruf der Prozedur nicht so aussehen ?
    PHP-Code:
    XML-INTO %HANDLER(partHandler ALLOK               
                      
    :%XML('/SPM/3856330.XML') : OPTIONS); 
    gruß
    michael

  3. #3
    Registriert seit
    Jan 2001
    Beiträge
    835
    Hi,

    sorry da war ich wohl falsch unterwegs.

    Hier aber noch ein hilfreicher Link
    XML-INTO: Output to Array Larger than 16 MB

  4. #4
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hast du schon probiert den die Handler-Proc genau so zu definieren wie in der Doku beschrieben?
    Code:
    D info      DS
    D attrName        20A VARYING
    D haveAttr          N
    D attrValue       20A VARYING
    * Prototype for procedure "myHandler" defining
    * the communication-area parameter as being
    * like data structure "info"
    D myHandler  PR   10I 0
    D commArea              LIKEDS(info)
    D event           10I 0 VALUE
    D string            *   VALUE
    D stringLen       20I 0 VALUE
    D exceptionId     10I 0 VALUE
    lg Andreas

  5. #5
    Registriert seit
    Dec 2005
    Beiträge
    276
    Hallo Gutmann,

    kann es daran liegen, dass du oben DPARTHANDLER (also nur in Grossbuchstaben) geschrieben hast, unten dann aber partHandler verwendest?

    MFG Zerberus

  6. #6
    Registriert seit
    Sep 2008
    Beiträge
    70
    Danke für die bisherigen Ideen/Hilfen,
    leider besteht das Problem immer noch.

    @Andreas: Habe mir den Eintrag im Handbuch angeschaut, hat mir zwar geholfen zu verstehen, wie der Handler arbeitet und aufgerufen wird, aber leider ist der Code für einen XML-SAX Aufruf vorgesehen.
    Für XML-Into muss der Parameter eigentlich nur aus drei Feldern bestehen (Link), demnach kann ich die CommArea beliebig definieren und jeden Wert oder Datenstruktur übergeben, solange in der Prozedur die gleichen Angaben gemacht werden.

    @Zerberus: Habe es gerade mal getestet und alle Felder in der gleichen Groß-Kleinschreibweise wie bei partHandler gebracht, aber ohne Erfolg, weiterhin die gleichen Fehlermeldungen beim Umwandeln.

  7. #7
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Das einzige was mir jetzt noch aufgefallen ist, war die Definition der Prozedur.
    Häng mal den VALUE beim Prototyp und der Prozedur selbst mal dran, damit der Wert nicht als Referenz übergeben wird.

    Code:
    D PARTHANDLER     PR            10I 0                         
    D   OK                            N                           
    D   PARTS                             LIKEREC(PARTREC) DIM(10)
    D   NUMRECS                     10U 0 VALUE

  8. #8
    Registriert seit
    Jan 2007
    Beiträge
    905
    Hi

    Vielleicht hilft Dir dieser Link etwas. Ich vermute mal, die ganze Krux hängt am Prototype.
    %Handling XML-INTO Problems | RPG
    kf

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    ... und sicherheitshalber noch einen CONST beim 2. Parameter
    Code:
    D PARTHANDLER     PR            10I 0                         
    D   OK                            N                           
    D   PARTS                             LIKEREC(PARTREC) DIM(10) CONST
    D   NUMRECS                     10U 0 VALUE
    ... sollte natürlich auch beim Procedure Interface angegeben werden!

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  10. #10
    Registriert seit
    Sep 2008
    Beiträge
    70
    Hallo,

    tausend Dank, es klappt .

    Warum ich kein VALUE mehr beim dritten Paramter stehen hatte, ist mir schleierhaft, aber mit gings noch immer nicht bzw. noch nicht.
    Erst mit CONST beim zweiten Parameter hat es geklappt. Jetzt wird zwar noch immer die Geschichte wegen: "Datenstruktur PARTS ist für die Operation nicht zulässig" angemeckert, aber ich kann das Programm jetzt ohne Write-Anweisung in der Prozedur umwandeln und die Werte aus dem XML werden korrekt in PARTS(i) geschoben.
    Für das Problem beim Write find ich sicher irgendnen Work-Around, von daher nochmal tausend Dank für die super schnelle Hilfe und allen noch einen schönen Tag

    *EDIT:
    Gerade über einen anderen Thread gestolpert, womit auch das Problem beim WRITE behoben wird (Link).
    Ich muss lediglich bei beiden LIKEREC(PARTREC: *OUTPUT) eintragen und schon läuft alles wie geschmiert.

Similar Threads

  1. XML Extender for iSeries
    By mom in forum IBM i Hauptforum
    Antworten: 30
    Letzter Beitrag: 22-01-07, 15:03
  2. Webservices, SOAP, XML und Labeldruck
    By vige1000 in forum NEWSboard Linux
    Antworten: 4
    Letzter Beitrag: 21-12-06, 11:56
  3. XML zu einem Port Senden
    By Weki in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 11-09-06, 13:31
  4. Formfeed in XML
    By kuempi von stein in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 05-07-06, 08:50
  5. converting xml to physical file data
    By svchetan in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 16-02-05, 07:20

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •