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.