AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

XML Daten in DB importieren

Ein Thema von ryLIX · begonnen am 23. Jan 2009 · letzter Beitrag vom 24. Jan 2009
Antwort Antwort
Seite 1 von 3  1 23   
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#1

XML Daten in DB importieren

  Alt 23. Jan 2009, 21:36
Hallo DPler

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
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#2

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 07:18
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.



PS: ich bin bekennender Firebird Fan...deshalb dieses als Empfehlung
  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#3

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 08:00
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.
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#4

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 08:11
...ich zeige dir einfach mal eine procedure
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;
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ß...
  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#5

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 08:19
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.



Herzlichen Dank
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#6

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 08:28
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...

  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#7

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 08:29
Ok werd mal reinschauen

Muss erstmal die Jedis Installieren
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#8

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 11:44
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
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#9

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 11:58
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.

  Mit Zitat antworten Zitat
ryLIX

Registriert seit: 16. Nov 2008
Ort: Westoverledingen
264 Beiträge
 
RAD-Studio 2009 Pro
 
#10

Re: XML Daten in DB importieren

  Alt 24. Jan 2009, 12:41
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

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
Aber die ausgelesenen Strings sind leer

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;
Markus
Hamburflys, Scrubble-Fubble-Puff-Shake, Muffin-Purper-Gurk?
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:58 Uhr.
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