[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Oct 2015
    Beiträge
    109

    Post XML einlesen mit XMLTABLE: übergeordnete Werte zu Gruppen hinzufügen.

    Hallo zusammen,

    ich möchte gerne aus einer XML mit diesem Aufbau:

    Code:
    <Gruppe>
        <Gruppennummer>5 <Gruppennummer>
        <Angestellte>
               <Namen>
                 <Vorname>Max <Vorname>
                 <Name>Mustermann <Name>
              <Namen>
    
               <Namen>
                  <Vorname>Max <Vorname>
                  <Name>Mustermann <Name>
              <Namen> 
        
    <Gruppe>
    


    eine Liste mit Gruppennummer, Name und Vorname erhalten.
    Es kann allerdings unendlich viele Elemente "Namen" geben.

    Mein erster Versuch war:

    Code:
           select Name, Vorname, Gruppennummer
           from (values(xmlparse(document
           get_xml_file(trim('//Beispiele/1.xml'))))) as xmlfile(BSP1),   
           xmltable('$BSP1/*:ExportFile/*:Gruppe'
           passing xmlfile.BSP1 as "BSP1"
           columns
           Vorname varchar(64) default ''
           path'*:Angestellte/*:Namen/*:Vorname',
           Name varchar(64) default ''
           path'*:Angestellte/*:Namen/*:Name',
           Gruppe integer default 0 path'../Gruppennummer'
    
    
    
           ) as BSP1
    leider wirft mir das
    [SQ16003] Ein Ausdruck des Datentyps ( item(), item()+) kann nicht verwendet werden, wenn der Datentyp item() für den Kontext verwendet wird.

    Nun dachte ich, ich könne einfach den Pfad eine Ebene tiefer ziehen:

    Code:
           select Name, Vorname, Gruppennummer
           from (values(xmlparse(document
           get_xml_file(trim('//Beispiele/1.xml'))))) as xmlfile(BSP1),   
           xmltable('$BSP1/*:ExportFile/*:Gruppe/*:Angestellte/*:Namen'
           passing xmlfile.BSP1 as "BSP1"
           columns
           Vorname varchar(64) default ''
           path'*:Vorname',
           Name varchar(64) default ''
           path'*:Name',
           Gruppe integer default 0 path'../Gruppennummer'
    
    
    
           ) as BSP1
    Diese Abfrage funktioniert für die Namen, ich erhalte jedoch leider keine Gruppennummer.

    Kennt sich jemand damit aus? Habe schon eine Weile vergeblich gesucht und getestet.

    Viele Grüße und besten Dank!



  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Ich denke, dass XMLTABLE da eher das liefert, was du benötigst (SQL-Handbuch).
    In der Spaltendefinition kann man dann nämlich noch weitere Pfade angeben:

    Code:
    SELECT     U."PO ID", U."Part #", U."Product Name",
        U."Quantity", U."Price", U."Order Date"
      FROM PURCHASEORDER P,
           XMLTABLE(XMLNAMESPACES(’http://podemo.org’ AS "pod"),
                   ’$po/PurchaseOrder/itemlist/item’ PASSING P.PORDER AS "po"
            COLUMNS "PO ID" INTEGER PATH ’../../@POid’,
                "Part #" CHAR(6) PATH ’product/@pid’,
                "Product Name" CHAR(50) PATH ’product/pod:name’,
                "Quantity" INTEGER PATH ’quantity’,
                "Price" DECIMAL(9,2) PATH ’product/pod:price’,
                "Order Date" TIMESTAMP PATH ’../../dateTime’
                ) AS U
       WHERE P.STATUS = ’NEW’
    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
    Aug 2014
    Beiträge
    179
    Folgende Statements habe ich mit Erfolg getestet
    PHP-Code:
    create or replace variable mylib.xml_var varchar(10000ccsid 1208;

    values mylib.xml_var;

    set mylib.xml_var =
    '<Gruppe>
        <Gruppennummer>5</Gruppennummer>
        <Angestellte>
               <Namen>
                 <Vorname>Max</Vorname>
                 <Name>Mustermann</Name>
              </Namen>

               <Namen>
                  <Vorname>Heike</Vorname>
                  <Name>Musterfrau</Name>
              </Namen>
         </Angestellte>    
    </Gruppe>'
    ;

    SELECT *
       
    FROM XMLTABLE('/Gruppe/Angestellte/Namen' 
          
    PASSING XMLPARSE(
             
    DOCUMENT mylib.xml_var
          

             
    COLUMNS
                gruppennummer integer PATH 
    '../../Gruppennummer'
                
    vorname varchar(20)   PATH 'Vorname',
                
    name    varchar(20)   PATH 'Name'
       
    ) AS RESULT
    Herzliche Grüße
    Rainer

  4. #4
    Registriert seit
    Oct 2015
    Beiträge
    109
    Hallo,

    Vielen Dank euch! so funktioniert es. '../../Gruppennummer'

    Scheinbar kann man mi ../ jeweils immer eine Ordnung nach oben wechseln.

    Viele Grüße,

    Daniel

  5. #5
    Registriert seit
    Aug 2014
    Beiträge
    179
    Mit diesem Statement kann man die Daten direkt aus dem IFS lesen und parsen

    PHP-Code:
    SELECT *
       
    FROM XMLTABLE('/Gruppe/Angestellte/Namen' 
          
    PASSING XMLPARSE(
             
    DOCUMENT get_clob_from_file('/home/import/xml/angestellte.xml')
          ) 
             
    COLUMNS
                gruppennummer integer PATH 
    '../../Gruppennummer'
                
    vorname varchar(20)   PATH 'Vorname',
                
    name    varchar(20)   PATH 'Name'
       
    ) AS RESULT

Similar Threads

  1. Löschen von PTF-Gruppen
    By Flappes in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 23-05-17, 10:07
  2. Antworten: 2
    Letzter Beitrag: 31-12-15, 11:52
  3. SQL erste x sätze aller Gruppen
    By dd3tj in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-02-15, 07:38
  4. Systemtabelle mit User/Gruppen
    By stemmerter in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 22-02-14, 17:33
  5. Platteneinheiten hinzufügen
    By moeller400 in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 28-06-01, 07:41

Berechtigungen

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