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

    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
    20.207
    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: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Jul 2008
    Beiträge
    76
    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.869
    Wie sieht denn das zugehörige XML-INTO Statement aus?

    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

  5. #5
    Registriert seit
    Jul 2008
    Beiträge
    76
    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
    76
    Guten Morgen,
    gibt es im Forum vielleicht noch eine Idee?
    Franco

  7. #7
    Registriert seit
    Aug 2014
    Beiträge
    179
    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
    904
    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
    179
    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
    76
    Funktioniert super, dann halt total free. Gruß Franco FDH

  11. #11
    Registriert seit
    Aug 2014
    Beiträge
    179
    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

Similar Threads

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

Berechtigungen

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