[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jul 2008
    Beiträge
    66

    Question XML Parsen / Behandeln der Feldinhalte der mehrfach vorkommenden Elemente

    Hallo,

    ich lese das XML nun ein.
    Allerdings habe ich das Problem, die mehrfach vorkommenden Artikelnummern anzusprechen,
    bzw. mir diese Felder in meine Dateifelder zu befördern. Als Tabellenfelder will das der Compiler nicht. Wie ist die Syntax?

    EVAL orders
    ORDERS.HEAD.ORDERNUMBER = '1TJW5S 2 '
    ORDERS.HEAD.VERSIONNUMBER.VERSIONNAME = 'XML.EANCOM.MBO'
    ORDERS.HEAD.VERSIONNUMBER.VERSIONNO = '8.1 '
    ORDERS.HEAD.LINE.LINEITEMNUMBER(1) = '1 '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(1) = 'E1527875LG'
    ORDERS.HEAD.LINE.LINEITEMNUMBER(2) = '2 '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(2) = 'N1527875RL'
    ORDERS.HEAD.LINE.LINEITEMNUMBER(3) = ' '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(3) = ' '
    ORDERS.HEAD.LINE.LINEITEMNUMBER(4) = ' '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(4) = ' '
    ORDERS.HEAD.LINE.LINEITEMNUMBER(5) = ' '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(5) = ' '

    //eval f41 = ORDERS.HEAD.LINE.LINEITEMNUMBER.Cnt_Line;
    //eval f42 = ORDERS.HEAD.LINE.LINEITEMNUMBER.Cnt_Line;
    //eval f41 = ORDERS.HEAD.LINE.LINEITEMNUMBER(Cnt_Line);
    //eval f42 = ORDERS.HEAD.LINE.LINEITEMNUMBER(2 );
    //eval f42 = ORDERS.HEAD.LINE.LINEITEMNUMBER(002.);

    dLine_t ds template
    d LineItemNumber...
    d 3a
    d ProductNumber...
    d 10a

    dhead_t ds qualified inz
    d OrderNumber 10a
    d VersionNumber likeDS(VersionNumber_t)
    d Line likeDS(Line_t) Dim(05)
    d Cnt_Line 3 0

    Dankeschön.

    Gruß
    Franco

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    18.252
    Der Debugger löst das etwas anders auf.
    Für den Compiler ist der ArrayIndex dann anzugeben, wenn man ein DIM(nn) defineirt hat.

    head_t. Line(n).LineItemNumber

    Funktioniert natürlich nur, wenn du das Template auch qualified machst:

    d Line_t ds template qualified
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: http://www.fuerchau.de/software/upload400.htm
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jul 2008
    Beiträge
    66
    Danke für die rasche Antwort.
    Hat aber leider noch nicht funktioniert

    dLine_t ds template qualified
    d LineItemNumber...
    d 3a
    d ProductNumber...
    d 10a

    dhead_t ds qualified inz
    d OrderNumber 10a
    d VersionNumber likeDS(VersionNumber_t)
    d Line likeDS(Line_t) Dim(05)
    d Cnt_Line 3 0

    dorders ds qualified inz
    d head LikeDS(head_t)

    EVAL orders ORDERS.HEAD.ORDERNUMBER = '1TJW5S 2 '
    ORDERS.HEAD.VERSIONNUMBER.VERSIONNAME = 'XML.EANCOM.MBO'
    ORDERS.HEAD.VERSIONNUMBER.VERSIONNO = '8.1 '
    ORDERS.HEAD.LINE.LINEITEMNUMBER(1) = '1 '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(1) = 'E1527875LG'
    ORDERS.HEAD.LINE.LINEITEMNUMBER(2) = '2 '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(2) = 'N1527875RL'
    ORDERS.HEAD.LINE.LINEITEMNUMBER(3) = ' '
    ORDERS.HEAD.LINE.PRODUCTNUMBER(3) = ' '
    ORDERS.HEAD.LINE.LINEITEMNUMBER(4) = ' '

    eval f41 = head_t.Line(1).LineItemNumber;
    eval f42 = head_t.Line(2).LineItemNumber;

    EVAL head_t.Line(1)
    HEAD_T.LINE.LINEITEMNUMBER(1) = ' '
    HEAD_T.LINE.PRODUCTNUMBER(1) = ' '

    Gruß
    Franco

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.556
    Wie sieht denn das zugehörige XML-INTO Statement aus?

    Birgitta
    Birgitta Hauser

    Contractor for Fresche Solutions Inc.
    Anwendungsmodernisierung, Beratung, Schulungen im Bereich RPG, SQL und Datenbank

  5. #5
    Registriert seit
    Jul 2008
    Beiträge
    66
    Guten Morgen,

    /free
    options = 'doc=file case=any allowmissing=yes allowextra=yes ' +
    'countprefix=cnt_ datasubf=data ';
    Filename = '/XMLOrderIN/20191031_221735_1TJW5S_2.xml';
    xml-into orders %xml(%Trim(Filename)ptions);
    ... ... ...

    Gruß
    Franco

  6. #6
    Registriert seit
    Jul 2008
    Beiträge
    66
    Guten Morgen,
    gibt es im Forum vielleicht noch eine Idee?
    Franco

  7. #7
    Registriert seit
    Aug 2014
    Beiträge
    147
    Hallo Franko,

    anbei die Lösung für das Problem

    HTML-Code:
             ctl-opt dftactgrp(*no);
          //------------------------------------------------------------------//
          //                                                                  //
          //  Parsen XML-DATEN - CCSID DER XML-DATEI MUSS 1208 SEIN           //
          //                                                                  //
          //-----------------                                                 //
          // R.Ross 11.2019 *                                                 //
          //------------------------------------------------------------------//
          // XML-Array - Root                                                 //
          //------------------------------------------------------------------//
    
             dcl-ds  Orders                qualified;
                      Head                 likeds(Head);
             end-ds;
    
          //------------------------------------------------------------------//
          // Template Head                                                    //
          //------------------------------------------------------------------//
    
             dcl-ds  Head                  template qualified;
                      VersionNumber        likeds(VersionNumber);
                      OrderNumber          char(20);
                      Line                 likeds(Line) dim(05);
                      Cnt_Line             int(10);
             end-ds;
    
             dcl-ds  VersionNumber         template qualified;
                      VersionName          char(20);
                      VersionNo            char(20);
             end-ds;
    
          //------------------------------------------------------------------//
          // Template Line - Enthält die Produkte                             //
          //------------------------------------------------------------------//
    
             dcl-ds  Line                  template qualified;
                      LineItemNumber       char(03);
                      ProductNumber        char(10);
             end-ds;
    
          //------------------------------------------------------------------//
          // Processing                                                       //
          //------------------------------------------------------------------//
    
               main();
    
               *inlr = *on;
          //------------------------------------------------------------------//
          // Main                                                             //
          //------------------------------------------------------------------//
             dcl-proc Main;
    
             dcl-s   LocOptions  varchar(128);            // XML-Options
             dcl-s   LocFile     varchar(128);            // File
    
             dcl-s   LocInd        uns(10);               // Index
             dcl-s   ItemNumber    like(Line.LineItemNumber);
             dcl-s   ProductNumber like(Line.ProductNumber);
    
               LocFile = '/Home/Import/xml/20191031_221735_1TJW5S_2.xml';
    
               LocOptions = 'doc=file case=any allowextra=yes +
                             countprefix=cnt_ datasubf=data';
    
               clear Orders;                              // Init XML-Struktur
    
               xml-into Orders %xml(LocFile:LocOptions);
    
               for LocInd = 1 to Orders.Head.Cnt_Line;    // Loop Produkte
                 ItemNumber    = Orders.Head.Line(LocInd).LineItemNumber;
                 ProductNumber = Orders.Head.Line(LocInd).ProductNumber;
               endfor;
    
             end-proc;
          //------------------------------------------------------------------// 

  8. #8
    Registriert seit
    Jan 2007
    Beiträge
    556
    Lieber Rainer ...
    ... und wenn Du nun noch einen Konverter hast, der die XSD gleich in DS Templates umsetzt, bist Du mein Tagesheld. Good Job!
    kf

  9. #9
    Registriert seit
    Aug 2014
    Beiträge
    147
    Ein Konverter wäre richtig cool. Es würde auch mit SQL gehen

    HTML-Code:
    SELECT *
      FROM XMLTABLE('/ORDERS/HEAD/LINE'
      PASSING xmlparse(
       DOCUMENT get_blob_from_file('/Home/Import/xml/mein.xml'))
      COLUMNS
       "ProductNumber" varchar(20) PATH 'ProductNumber',
       "ProductName"   varchar(20) PATH 'ProductName'
     );

  10. #10
    Registriert seit
    Jul 2008
    Beiträge
    66
    Funktioniert super, dann halt total free. Gruß Franco FDH

  11. #11
    Registriert seit
    Aug 2014
    Beiträge
    147
    Das freut mich sehr, dass es jetzt funktioniert

    Habt Ihr Interesse coole Webanwendungen auf IBM i zu programmieren?
    - Responsive Webdesign für PC, iPad und Smartphone
    http://www.myhofi.com/dev/html/DataViewResponsive.html
    - Stammdaten verwalten http://www.myhofi.com/tms/HTML/MySubfileApp04.html
    - Projektverwaltung mit Gantt http://www.myhofi.com/tms/HTML/MyGantt.html
    - schnelle Volltextsuche http://www.myhofi.com/music/html/musicsearch.html

    Hier gibts die Workshops https://www.toolmaker.de/schulungen/

    Herzliche Grüße
    Rainer Ross It-Beratung

Ähnliche Themen

  1. XML Parsen
    Von fdh im Forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 20-11-19, 14:43
  2. Vergleichen Feldinhalte von qualifizierten Datenstrukturen
    Von it-dol im Forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 24-07-14, 14:05

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •