Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi TXMLDocument Struktur erstellen jedoch bleibt die Datei leer (https://www.delphipraxis.net/125397-txmldocument-struktur-erstellen-jedoch-bleibt-die-datei-leer.html)

TUX_der_Pinguin 5. Dez 2008 10:26


TXMLDocument Struktur erstellen jedoch bleibt die Datei leer
 
Ich hab hier eine Anwendung die eine XML Datei erstellen/speichern soll.
Jedoch klappt das irgendwie nicht Knoten hinzu zufügen bzw. beim Speichern
der Datei am Ende wird eine 0 Byte große Datei erstellt.

Irgendwie bin ich ratlos, was ich machen muß um den Root Knoten zuerstellen
und dann weitere Unterknoten.

Zur Erstellung benutze ich die Komponente TXMLDocument von Delphi 2007 Prof. für Win32

Delphi-Quellcode:
XMLDoc := TXMLDocument.Create(Application);
try
  XMLDoc.Active  := True;
  XMLDoc.Version := '1.0';
  XMLDoc.Encoding := 'UFT-8';

  //Root Node
  RootNode := XMLDoc.AddChild('tables');

  for Idx := 0 to High(Tables) do begin
    ItemNode := RootNode.AddChild('tab'+IntToStr(Idx));
    ItemNode.Attributes['name'] := Tables[Idx].Name;
  end;{for}

  XMLDoc.Active := True;

  //Node := XMLDoc.AddChild('tables');
  Writeln(XMLDoc.XML.Text);

  //XML Dokument formatieren
  XMLDoc.XML.Text := FormatXMLData(XMLDoc.XML.Text);
  XMLDoc.Active  := True;

  //XML Dokument speichern
  XMLDoc.SaveToFile('tables.xml');
finally
  XMLDoc.Free;
end;

himitsu 5. Dez 2008 15:58

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
 
Bis zu dem Zweiten/Alleinstehenden und eigentlich unnötigen XMLDoc.Active:=True; dürfte es keine Probleme geben,
aber aber was macht FormatXMLData?

TUX_der_Pinguin 8. Dez 2008 07:24

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
 
Delphi-Quellcode:
FormatXMLData()
Mit dieser Funktion kann man die zuvor erstellte Struktur formatieren.

Also aus
XML-Code:
<root><child><tag attrib="1"/></child></root>
wird
XML-Code:
<root>
  <child>
    <tag attrib="1"/>
  </child>
</root>
Was mir noch eingefallen ist, das ganze findet in einer Konsolenanwendung statt aber das sollte ja wohl nicht das
Problem sein, irgendwie schaffe ich es nicht dem Object die gewünschte Struktur zuzuweisen. Obwohl ich versucht
habe das gleiche zu machen wie es in einigen Posts hier beschrieben wird.

Bernhard Geyer 8. Dez 2008 07:30

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
 
Zitat:

Zitat von TUX_der_Pinguin
Was mir noch eingefallen ist, das ganze findet in einer Konsolenanwendung statt aber das sollte ja wohl nicht das Problem sein, ...

Was passiert in einer Test-GUI-Anwendung? Ist evtl. das bekannte "fehlende CoInitialize" der Fehler (und in der Konsolenanwendung fällt dir nur nicht die auftretende Exeption auf?)

TUX_der_Pinguin 8. Dez 2008 07:59

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
 
Hier mal der komplette Quelltext der Konsolenanwendung inkl. der Coinitialize Anweisung.

Also das Programm soll eine ini Datei einlesen und die Daten dann entsprechend in einer XML Datei wieder speichern.

In einer Test Anwendung (GUI) passiert ebenfalls nichts, die Datei wird zwar erstellt aber immer ohne Inhalt. In der
Konsolen Anwendung erhalte ich nach der Tastenabfrage am Ende noch eine Exception die aber nicht näher Beschrieben wird
oder der Ursprung festzustellen ist.

Irgendwie bin ich grade ziemlich ratlos. Was vielleicht mal helfen würde wenn mir jemand ein kleines Beispiel geben
könnte wie man mit Hilfe von TXMLDocument eine XML Datei erzeugt. Also ein funktionierendes Beispiel ;-)

Delphi-Quellcode:
program TabConv;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  INIFiles,
  Forms,
  Classes,
  uTools,
  xmldom,
  XMLIntf,
  msxmldom,
  XMLDoc,
  ActiveX;

type
  tTable = record
    Name  : String;
    Fields : array of string;
  end;

  tTables = array of tTable;


var
  INI      : TIniFile;
  Tables   : tTables;
  Sections : TStringList;
  Idx,i    : Integer;
  Count    : Integer;
  XMLDoc   : TXMLDocument;
  RootNode : IXMLNode;
  ItemNode : IXMLNode;

begin
  try
  { TODO -oEntwickler -cKonsole Main : Hier Code einfügen }
    //init
    CoInitialize(nil);
                             
    //Ini Datei öffnen
    ini := TIniFile.Create(ExtractFilePath(Application.ExeName)+'tables.ini');
    try
      //Sektionen ermitteln
      Sections := TStringList.Create;
      try
        //Sektionen aus ini Datei auslesen
        ini.ReadSections(Sections);

        //Anzahl der Tabellen setzen
        SetLength(Tables, Sections.Count);

        //Namen der einzelnen Tabellen ermitteln
        for Idx := 0 to High(Tables) do begin
          Tables[Idx].Name := Sections[Idx];
        end;{for}

      finally
        Sections.Free;
      end;

      //Tabellen einlesen
      if Length(Tables) > 0 then begin
        for Idx := 0 to High(Tables) do begin
          //Anzahl der "Spalten" ermitteln
          Count := ini.ReadInteger(Tables[Idx].Name, 'count', 0);

          //Anzahl der Spalten zuweisen...
          SetLength(Tables[Idx].Fields, Count);

          ///"Spalten" einlesen
          for i := 0 to High(Tables[Idx].Fields) do begin
            Tables[Idx].Fields[i] := ini.ReadString(Tables[Idx].Name, IntToStr(i), 'IIDNR');
          end;{for}

        end;{for}
      end;{if}

    finally
      ini.Free;
    end;

    //Nach XML Konvertieren
    if Length(Tables) > 0 then begin
      XMLDoc := TXMLDocument.Create(Application);
      try
        XMLDoc.Active  := True;
        XMLDoc.Version := '1.0';
        XMLDoc.Encoding := 'UFT-8';

        //Root Node
        RootNode := XMLDoc.AddChild('tables');

        for Idx := 0 to High(Tables) do begin
          ItemNode := RootNode.AddChild('tab'+IntToStr(Idx));
          ItemNode.Attributes['name'] := Tables[Idx].Name;
        end;{for} 

        //XML Dokument formatieren
        XMLDoc.XML.Text := FormatXMLData(XMLDoc.XML.Text);
        XMLDoc.Active  := True;

        //XML Dokument speichern
        XMLDoc.SaveToFile('tables.xml');
      finally
        XMLDoc.Free;
      end;

    end;{if}

    Writeln;
    Writeln(fAnsiToAscii('Beliebige Taste für weiter...'));
    Readln;

  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;

  //deinit
  CoUninitialize;

end.
Falls das jemand bei Sich Testen will die Ini Datei ist wie folgt aufgebaut.

Zitat:

[Tab_Name]
count=3
0=Feld1
1=Feld2
2=Feld3

himitsu 8. Dez 2008 19:40

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
 
hast du mal ohne FormatXMLData gespeichert? (wenn da noch alles da ist, dann stimmt wohl an deinerder FormatXMLData-Funktion etwas nicht)

Also ich laß bei mir so die XML Dateien erstellen
und praktisch dabei ist, daß bei mir alles schön formatiert ist :angel:
Delphi-Quellcode:
XMLDoc := TXMLDocument.Create(Application);
Try
  XMLDoc.Active    := True;
  XMLDoc.Version   := '1.0';
  XMLDoc.Encoding  := 'UTF-8';
  XMLDoc.StandAlone := 'yes';
  XMLDoc.Options   := [doNodeAutoCreate, doNodeAutoIndent, doAttrNull];
  XMLDoc.AddChild('tables');

  for Idx := 0 to High(Tables) do begin
    ItemNode := RootNode.AddChild('tab'+IntToStr(Idx));
    ItemNode.Attributes['name'] := Tables[Idx].Name;
  end;{for}

  XMLDoc.SaveToFile('tables.xml');
Finally
  XML.Free;
End;
wichtig dabei ist doNodeAutoIndent in den Options :zwinker:

[add]
hab mal nach FormatXMLData gesucht und soweit ich das Seh, macht dieses nichts anderes, als den XML-String in ein neues XML-Dokument zu laden, dann alle Nodes wiederum in ein weieres XML-Dokument zu kopieren und dann dieses wieder in einen XML-String ... und du kopierst vorher Dokument in einen string und hinterher andersrum ... also warum erst hinundherkopieren und nicht gleich formatiert erstellen?

TUX_der_Pinguin 9. Dez 2008 07:34

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
 
Also in meiner Konsolen Anwendung klappt nach wievor nix, aber ich beführchte langsam da es an einem anderen Grund liegt.
In einer kleinen Testanwendung funktioniert das Erstellen jetzt so wie "himitsu" beschrieben hat, da ich bisher nie
die "Options" verwendet habe, die das XML Dokument automatisch formatieren, benötige ich jetzt das FormatXMLData()
auch nicht mehr.

Ich werde die Konsolenanwendung einfach noch mal kompl. neu Erstellen, sind ja eh nur ein paar Zeilen.

Also vielen dank schon mal für die Hilfe, einen schönen Tag noch.


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:12 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