AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Problem beim Auslesen mit mehreren Ebenen (MSXML)
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Auslesen mit mehreren Ebenen (MSXML)

Ein Thema von RWarnecke · begonnen am 11. Apr 2010 · letzter Beitrag vom 11. Apr 2010
Antwort Antwort
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#1

Problem beim Auslesen mit mehreren Ebenen (MSXML)

  Alt 11. Apr 2010, 13:44
Hallo zusammen,

ich habe die folgende XML-Datei (ein Ausschnitt) :
XML-Code:
<Haupt>
  <Kunde>
    <Stammdaten>
      <Datensatz>
        <STAMMNR>373</STAMMNR>
        <STATUSNR>2</STATUSNR>
        <FIRMA>1</FIRMA>
        <NAME>'Neuer'</NAME>
        <VORNAME>''</VORNAME>
        <KURZNAME>'Neuer'</KURZNAME>
        <ANREDENR>5</ANREDENR>
        <BEMERKUNG>''</BEMERKUNG>
        <KENWORT>''</KENWORT>
        <AKTIVE>1</AKTIVE>
      </Datensatz>
    </Stammdaten>
    <Adresse />
    <Internet />
    <Telefon />
  </Kunde>
</Haupt>
Da mehrere solcher Abschnitte folgen können, versuche ich mit dieser Procedure die Struktur einzulesen und ein SQL-Skript daraus zu bauen :
Delphi-Quellcode:
procedure TImportDlgForm.BBtn_ImportClick(Sender: TObject);
var
  CustomerCount : Integer;
  newCustomer : IXMLDOMNodeList;
  newDataSet : IXMLDOMNodeList;
  ArrCount : Integer;
  FieldsCounter : Integer;
  newSQLCommand : TStringList;
  newFieldsNames: string;
  newFieldsValue: string;
  subNode: IXMLDOMNode;
begin
  newSQLCommand := TStringList.Create;
  newSQLCommand.Clear;
  newCustomer := xmlDoc.documentElement.selectNodes('Kunde');
  for CustomerCount := 0 to newCustomer.length - 1 do
  begin
    for ArrCount := 0 to 4 do
    begin
      newFieldsNames := ''; newFieldsValue := '';
      newDataSet := newCustomer.item[CustomerCount].selectNodes(DBTables[ArrCount] + '/Datensatz');
      if newDataSet.length <> 0 then
      begin
        FieldsCounter := 0;
        subNode := newDataSet.item[FieldsCounter].firstChild;
        while newDataSet <> nil do
        begin
          newFieldsNames := newFieldsNames + subNode.nodeName + ', ';
          newFieldsValue := newFieldsValue + subNode.Text + ', ';
          subNode := newDataSet.item[FieldsCounter].nextSibling
        end;
        newSQLCommand.Add('INSERT INTO ' + DBTables[ArrCount] + ' (' + newFieldsNames + ') Values (' + newFieldsValue + ');');
      end;
    end; // FOR-Schleife für das Array der Datenbanktabellen
  end; // FOR-Schleife für die Anzahl der Kunden
  newSQLCommand.SaveToFile('D:\Test.sql');
end;
Das funktioniet bis zur ersten Node unterhalb der Ebene <Datensatz>. Beim zweiten Mal kommt eine AccessViolation in der Zeile 28. Ich habe es auch schon mit einen FieldsCounter := FieldsCounter + 1; nach der Zeile FieldsValue ausprobiert. Nur dann kommt die AccessViolation in der Zeile subNode := newDataSet.item[FieldsCounter].nextSibling Was mache ich wo falsch und warum ? Fange gerade erst an mit MSXML zu arbeiten.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

Re: Problem beim Auslesen mit mehreren Ebenen

  Alt 11. Apr 2010, 13:47
*edit*
ups. falsch verstanden ... ich les gleich nochmal in Ruhe alles genauer durch

[edit]
for CustomerCount := 0 to newCustomer.length - 1 do Hab hier grad kein Delphi und sonst seh ich auch erstmal nichts,
aber sicher daß .Length stimmt? (ich hätte eher sowas wie .Count erwartet )
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#3

Re: Problem beim Auslesen mit mehreren Ebenen

  Alt 11. Apr 2010, 13:58
Nee, das Length stimmt schon. Es gibt kein Count.

Edit:
Danke himitsu, ich habe es gerade selber gelöst. Die While-Schleife sieht jetzt so aus :
Delphi-Quellcode:
while subNode <> nil do
begin
  newFieldsNames := newFieldsNames + subNode.nodeName + ', ';
  newFieldsValue := newFieldsValue + subNode.Text + ', ';
  subNode := subNode.nextSibling;
end;
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:43 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