Delphi-PRAXiS
Seite 1 von 3  1 23   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi XML Daten in DB importieren (https://www.delphipraxis.net/128090-xml-daten-db-importieren.html)

ryLIX 23. Jan 2009 21:36


XML Daten in DB importieren
 
Hallo DPler :hi:

Ich sitze grade vor einem Problem was mir üble Kopfschmerzen bereitet.
Ich muss ca. 450.000 Zeilen XML Daten in eine DB haben.
Es sollte eine Embedded DB sein. Welche is mir im Moment wurscht (SQLite, Firebrid etc.).

Die Daten haben folgende Struktur:

XML-Code:
<ROOT>
<Node value="E31">
      <Node value="ABGB-C02" />
      <Node value="ABGZ-C01" />
      <Node value="ASC5-C01" />
      <Node value="ASC5-C06" />
      <Node value="DSC-C01" />
      <Node value="DWA3-C25" />
      <Node value="DWA4-C27" />
      <Node value="EDC3-C00" />
      <Node value="EDC3P-C25" />
      <Node value="EKM-C00" />
      <Node value="EKM-C01" />
      <Node value="EKM-C25" />
      <Node value="EML-C01" />
      <Node value="EWS-C01" />
      <Node value="EWS-C02" />
      <Node value="GM2-C25" />
      <Node value="LKM2-C25" />
      <Node value="LSM-C25" />
      <Node value="ZAE2-C03" />
      <Node value="ZAE2-C05" />
    </Node>
<--!Viele Subnodes weiter-->
</ROOT>
Wobei das nur ein SubNode ist.
Es gibt noch eine andere Variante (das ist der Aufbau der meisten Daten(~90%)):

XML-Code:
<ROOT>
<E31ASC5-C06 value="ASC5-C06">
    <FSW value="MRA_TAKTUNG">
      <PSW value="aktiv"/>
      <PSW value="nicht_aktiv"/>
    </FSW>
    <FSW value="LASTBEREICHSKENNFELD">
      <PSW value="aktiv"/>
      <PSW value="nicht_aktiv"/>
    </FSW>
    <FSW value="SCHLUPFSCHWELLENOFFSET">
      <PSW value="aktiv"/>
      <PSW value="nicht_aktiv"/>
    </FSW>
    <FSW value="GETRIEBE">
      <PSW value="automatik"/>
      <PSW value="handschaltung"/>
    </FSW>
    <FSW value="BMR_TYP">
      <PSW value="typ_1"/>
      <PSW value="typ_2"/>
      <PSW value="typ_3"/>
    </FSW>
    <FSW value="AMR_TYP">
      <PSW value="typ_1"/>
      <PSW value="typ_2"/>
      <PSW value="typ_3"/>
    </FSW>
    <FSW value="SCHLUPFBANDMODIFIKATION">
      <PSW value="nicht_aktiv"/>
      <PSW value="absenkung_0.5_km/h"/>
    </FSW>
    <FSW value="MRAGRENZ">
      <PSW value="wert_01"/>
    </FSW>
    <FSW value="KURVENLOGIK">
      <PSW value="typ_1"/>
      <PSW value="typ_2"/>
      <PSW value="typ_3"/>
    </FSW>
  </E31ASC5-C06>
<--!Viele Subnodes weiter-->
</ROOT>
Ich hatte erst versucht die Daten so zu nutzen aber das ist absolut inakzeptabel von der Geschwindigkeit her.
Man meint das die Daten aus dem Web geladen werden und nicht direkt von der Platte :?

Jetzt suche ich eine Möglichkeit diese Daten möglichst einfach in eine Datenbank zu bringen.
Erste versuche mit Access sind kläglich gescheitert.
Insgesamt Teilt sich die Datenmenge auf 18 Solcher Dateien auf.
Die zentrale Liste hat das zu erst gepostete Format die anderen 17 das zweite Format.
Wie kann ich nun das ganze am schnellsten in Tabellen bringen?

Mit den <Node> Elementen habe ich bisher ein Treeview gefüllt.
Das wollte ich auch gern bei behalten.
Für die Bereiche <FSW> sowie <PSW> ist jeweils eine ListBox vorgesehen.
Hier wäre es optimal wenn die ID der FSW mit dem Index in der Listbox übereinstimmt damit ich darüber die passenden <PSW> Elemente finde.

Als XML Parser habe ich ADOM (OpenXML) im einsatz.
Damit komme ich auch gut klar aber die Geschwindigkeit ist unzumutbar für Anwender.

Ich wäre dankbar wenn mir jemand etwas Hilfe bei der Umsetztung geben könnte da XML immer noch nich so ganz meins ist :stupid:

haentschman 24. Jan 2009 07:18

Re: XML Daten in DB importieren
 
Hallo...

ich benutze für so etwas SimpleXML von den Jedis. Dann schreibe ich mir passend zu den Daten eine procedure, welche die Daten in die Datenbank einträgt (eventuell noch mit Informationen welche nicht im XML stehen).

...das ist aber auch keine schnelle Variante. Wie oft mußt du die XML einlesen ?. Ich brauche, da das Einlesen / Konvertieren in 2 Schleifen abläuft, für 40000 Datensätze ca. 20-30 Sekunden.

:hi:

PS: ich bin bekennender Firebird Fan...deshalb dieses als Empfehlung :P

ryLIX 24. Jan 2009 08:00

Re: XML Daten in DB importieren
 
Wie lange das braucht ist mir egal.
Da ich die Daten nur einmal da rein bringen muss danach kann ich die Updates direkt machen.

Ich werde mir das mit den Jedis mal anschauen danke für den Tipp.
Hast du eventuell noch ne kleine Anleitung zu dem ganzen damit ich mich mal einlesen kann?
Habe bisher die Jedis nicht genuzt.

haentschman 24. Jan 2009 08:11

Re: XML Daten in DB importieren
 
...ich zeige dir einfach mal eine procedure :wink:
Delphi-Quellcode:
// Import XML Gebührenordnung
procedure TDMDB.XMLImportGE;
var
  AnzahlDS: Integer;
  A: Integer;
  I: Integer;
  Inhalt: TStringList;
begin
  Inhalt:= TStringList.Create;
  try
    JvSimpleXML1.FileName:= InstallPfad + 'GE.xml';
    AnzahlDS:= JvSimpleXML1.Root.Items.Item[1].Items.Count;
    if Start then
      begin
        Splash.JvXPProgressBar1.Max:= AnzahlDS;
        Splash.JvXPProgressBar1.Position:= 0;
        Splash.JvLabel1.Caption:= 'Import GebüH...';
      end;
    Splash.JvXPProgressBar1.Refresh;
    Splash.JvLabel1.Refresh;
    for A:= 0 to AnzahlDS -1 do
      begin
        try
          Inhalt.Clear;
          Splash.JvXPProgressBar1.Refresh;
          for I:= 0 to 2 do
            begin
              Inhalt.Add(JvSimpleXML1.Root.Items.Item[1].Items.Item[A].Items.Item[I].Value);
            end;
          ZQueryDiv.SQL.Text:= 'insert into GEBUH (GRUPPE,UNTERGRUPPE,TEXT,GEBUHID,LEISTUNG,NUMMER,ICON) values ';
          ZQueryDiv.SQL.Add('(:Gruppe,:Untergruppe,:Text,:GebuhID,:Leistung,:Nummer,:Icon)');
          ZQueryDiv.ParamByName('Gruppe').Value:= A+2;
          ZQueryDiv.ParamByName('Untergruppe').Value:= 1;
          ZQueryDiv.ParamByName('Text').Value:= Inhalt.Strings[2] + '  ' + Inhalt.Strings[1];
          ZQueryDiv.ParamByName('GebuhID').Value:= StrToInt(Inhalt.Strings[0]);
          ZQueryDiv.ParamByName('Leistung').Value:= Inhalt.Strings[1];
          ZQueryDiv.ParamByName('Nummer').Value:= Inhalt.Strings[2];
          ZQueryDiv.ParamByName('Icon').Value:= 2;
          ZQueryDiv.ExecSQL;
        except
          FehlerCode:= 'E422';
          Fehlerstatus:= False;
          Fehlertext:= 'Import der GebüH fehlgeschlagen. ';
          raise;
        end;
        if Start then Splash.JvXPProgressBar1.Position:= A;
        Splash.JvXPProgressBar1.Refresh;
      end;
  finally
    Inhalt.Free;
  end;
  try
    if FileExists(InstallPfad + 'GE.xml') then DeleteFile(InstallPfad + 'GE.xml');
  except
    FehlerCode:= 'E421';
    Fehlerstatus:= True;
    Fehlertext:= 'Löschen der Datei GE.xml fehlgeschlagen. ';
    raise;
  end;
  FGebuH.GEBUHEinlesen;
end;
Delphi-Quellcode:
Inhalt.Add(JvSimpleXML1.Root.Items.Item[1].Items.Item[A].Items.Item[I].Value);
...mit diesem Part mußt du dann etwas experimentieren entsprechend der Struktur deiner XML.

Der Ablauf ist im Prinzip folgender:
- 1. Schleife A -- Anzahl der Datensätze / Nodes
- 2. Schleife I -- Schreibt die Values des Nodes in eine StringList, I(MAX) entspricht der Menge der Values in der StringList (in diesem Falle 2..bei dir vieleicht anders)
- 3. Insert in DB mit den Werten der StringList
....usw.

viel Spaß... :wink:

ryLIX 24. Jan 2009 08:19

Re: XML Daten in DB importieren
 
Danke dir.
Das sieht relativ einfach aus.
Hatte schon den Verdacht das mich das einige graue Haare kosten würd aber damit sieht es im Moment sehr einfach aus.

:dp:

Herzlichen Dank :cheers:

haentschman 24. Jan 2009 08:28

Re: XML Daten in DB importieren
 
PS: du kannst die Nodes in der XML auch anders identifizieren. Schaust du einfach was JvSimpleXML dir an Propertys bietet. Für mich bot sich ITEMS an, da ich das dann gut über den Index in der Schleife verarbeiten kann.

PS1: den ganzen Visualisierungskram kannst du ja weg lassen... :P

:hi:

ryLIX 24. Jan 2009 08:29

Re: XML Daten in DB importieren
 
Ok werd mal reinschauen :)

Muss erstmal die Jedis Installieren :)

ryLIX 24. Jan 2009 11:44

Re: XML Daten in DB importieren
 
So das mit dem Items identifizieren is mir nun klar.
Geht über Item[index] oder ItemNamed[name].

Aber wie komme ich an die Attribute des Items?
Die Methodenliste gibt da nix her :(

haentschman 24. Jan 2009 11:58

Re: XML Daten in DB importieren
 
ich denke daß du...

Item[x].Value meinst. Das repräsentiert den Wert deines ItemNamed['blabla']
oder
dein ItemNamed['blabla'] hat wieder Items.Item[x].Value je nach Verzweigung deiner Vorlage.

:hi:

ryLIX 24. Jan 2009 12:41

Re: XML Daten in DB importieren
 
Hatte einen test gemacht mit einem Memo.
Delphi-Quellcode:
  OpenDialog1.Execute();
  if OpenDialog1.FileName <> '' then
  begin
      JvSimpleXml1.FileName := OpenDialog1.FileName;
      for I := 0 to JvSimpleXML1.Root.Items.Item[0].Items.Count - 1 do
        Memo1.Lines.Add(JvSimpleXML1.Root.Items.Item[0].Items.Item[I].Value)
  end;
Nur bleibt das Memo leer :wiejetzt:

Edit:
Er findet auf jeden Fall Items da I > 0 ist ;)
Hab ich grad noch mal im Debug gecheckt.

Noch mal Edit:
Nu passiert was :idea:
Aber die ausgelesenen Strings sind leer :wiejetzt:

Haha rate mal ein Edit:
So gehts:
Delphi-Quellcode:
var
  I: Integer;
begin
  OpenDialog1.Execute();
  if OpenDialog1.FileName <> '' then
  begin
      JvSimpleXML1.LoadFromFile(OpenDialog1.FileName);
      for I := 0 to JvSimpleXML1.Root.Items.Item[0].Items.Count - 1 do
        Memo1.Lines.Add(JvSimpleXML1.Root.Items.Item[0].Items.Item[I].Properties.Value('value'));
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:46 Uhr.
Seite 1 von 3  1 23   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz