Einzelnen Beitrag anzeigen

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