Einzelnen Beitrag anzeigen

toko

Registriert seit: 19. Apr 2005
40 Beiträge
 
#1

Probleme mit wohlgeformte-XML-Datei

  Alt 26. Mai 2005, 15:04
Hallo,

ich benutze eine XML-Datei um CD-Listen abzuspeichern. Den Dateinamen können die Benutzer selber wählen.
Also für eine CD-Listen eine XML-Datei.
Ich habe folgende Prozedur zum Anlegen einer XML-Datei:
Delphi-Quellcode:
procedure TfrmMain.createNewXMLFile;
var
  NewXMLDoc : TXMLDocument;
  xmlInitializeContents : TStrings;
begin
  NewXMLDoc := TXMLDocument.Create(self);
  xmlInitializeContents := TStringList.Create;
  xmlInitializeContents.Add('<?xml version="1.0"?>');
  xmlInitializeContents.Add('<!DOCTYPE ?Name_weiß_ich_nicht? "?Name_weiß_ich_nicht?.dtd">');
  xmlInitializeContents.Add('<cdorganizer>');
  xmlInitializeContents.Add('</cdorganizer>');
  NewXMLDoc.XML := xmlInitializeContents;
  NewXMLDoc.Active := true;
  if dlgSave.Execute then begin
    NewXMLDoc.FileName := dlgSave.FileName;
    NewXMLDoc.SaveToFile(NewXMLDoc.FileName);
  end;
  NewXMLDoc.Active := true;
end;
Damit die XML-Datei wohlgeformt ist, muss doch folgende Zeile eingefügt werden, oder?
  xmlInitializeContents.Add('<!DOCTYPE ?Name_weiß_ich_nicht? "?Name_weiß_ich_nicht?.dtd">'); hier habe ich aber das Problem, dass ich nicht weiß, welche Datei der Benutzer später im SaveDialog angibt, um so die dtd-Datei zu erstellen.

Liege ich den damit richtig? Denn wenn ich den "Doctype" weglasse sieht meine xml-Datei so aus:
XML-Code:
<?xml version="1.0"?>
<cdorganizer>
   <cd><cdid>1</cdid><cdtitel>test</cdtitel><interpret>test</interpret><genre>test</genre></cd><cd></cdorganizer>
Die CD-Elemente lege ich folgendermaßen an:
Delphi-Quellcode:
procedure TfrmCD.btnOKClick(Sender: TObject);
var
  cdobj: TCD;
  newsub,
  newcd : IXMLDOMNode;
begin
  cdobj := TCD.Create;
  cdobj.CDTitel := edtTitel.Text;
  cdobj.CDInterpret := edtInterpret.Text;
  cdobj.CDGenre := edtGenre.Text;
  cdobj.Save;
  {in XML-Datei schreiben, anfang}
  newcd := frmMain.xmlDoc.createElement('cd');

  newsub := frmMain.xmlDoc.createElement('cdid');
  newsub.text := IntToStr(frmMain.strgrdCDListe.RowCount);
  newcd.appendChild(newsub);

  newsub := frmMain.xmlDoc.createElement('cdtitel');
  newsub.text := cdobj.CDTitel;
  newcd.appendChild(newsub);

  newsub := frmMain.xmlDoc.createElement('interpret');
  newsub.text := cdobj.CDInterpret;
  newcd.appendChild(newsub);

  newsub := frmMain.xmlDoc.createElement('genre');
  newsub.text := cdobj.CDGenre;
  newcd.appendChild(newsub);

  frmMain.xmlDoc.documentElement.appendChild(newcd);
  frmMain.xmlDoc.save(frmMain.xmlfile);
  {in XML-Datei schreiben, ende}
  
  {in TStringGrid zu Ansicht darstellen}
  with frmMain.strgrdCDListe do begin
    begin
      RowCount := frmMain.strgrdCDListe.RowCount+1;
      Cells[0,frmMain.strgrdCDListe.RowCount-1]:=IntToStr(frmMain.strgrdCDListe.RowCount-1);
      Cells[1,frmMain.strgrdCDListe.RowCount-1] := cdobj.CDTitel;
      Cells[2,frmMain.strgrdCDListe.RowCount-1] := cdobj.CDInterpret;
      Cells[3,frmMain.strgrdCDListe.RowCount-1] := cdobj.CDGenre;
      RowHeights[frmMain.strgrdCDListe.RowCount-1] := rowxheights;
    end;
  end;
  cdobj.Free;
  Close;
end;
Ich habe nämlich vor im nachhinen nach einer "cd" über die cd-id zu suchen und weitere Kindknoten an diesem Eintrag anhängen.
Z.B. soll die Datei dann folgendermaßen aussehen:
XML-Code:
<?xml version="1.0"?>
<cdorganizer>
    <cd>
        <cdid>1</cdid>
        <cdtitel>titel 1</cdtitel>
        <interpret>interpret 1</interpret>
        <genre>genre 1</genre>
        <track>
            <trackid>1</trackid>
            <tracktitel>track 1</tracktitel>
            <dauer>3:11:07</dauer>
        </track>
        <track>
            ...
        </track>
    </cd>
    <cd>
        ...
    </cd>
</cdorganizer>
Über Hilfe bin ich sehr dankbar. Kritik zum Code ist ebenfalls willkommen.

gruß
  Mit Zitat antworten Zitat