![]() |
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; |
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? |
Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
Delphi-Quellcode:
Mit dieser Funktion kann man die zuvor erstellte Struktur formatieren.
FormatXMLData()
Also aus
XML-Code:
wird
<root><child><tag attrib="1"/></child></root>
XML-Code:
Was mir noch eingefallen ist, das ganze findet in einer Konsolenanwendung statt aber das sollte ja wohl nicht das
<root>
<child> <tag attrib="1"/> </child> </root> 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. |
Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei
Zitat:
|
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:
Falls das jemand bei Sich Testen will die Ini Datei ist wie folgt aufgebaut.
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. Zitat:
|
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:
wichtig dabei ist doNodeAutoIndent in den Options :zwinker:
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; [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? |
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