Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Problem beim Auslesen mit mehreren Ebenen (MSXML) (https://www.delphipraxis.net/150246-problem-beim-auslesen-mit-mehreren-ebenen-msxml.html)

RWarnecke 11. Apr 2010 12:44


Problem beim Auslesen mit mehreren Ebenen (MSXML)
 
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
Delphi-Quellcode:
FieldsCounter := FieldsCounter + 1;
nach der Zeile FieldsValue ausprobiert. Nur dann kommt die AccessViolation in der Zeile
Delphi-Quellcode:
subNode := newDataSet.item[FieldsCounter].nextSibling
Was mache ich wo falsch und warum ? Fange gerade erst an mit MSXML zu arbeiten.

himitsu 11. Apr 2010 12:47

Re: Problem beim Auslesen mit mehreren Ebenen
 
*edit*
ups. falsch verstanden ... ich les gleich nochmal in Ruhe alles genauer durch

[edit]
Delphi-Quellcode:
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 :gruebel: )

RWarnecke 11. Apr 2010 12:58

Re: Problem beim Auslesen mit mehreren Ebenen
 
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;


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:53 Uhr.

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