AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi TXMLDocument Struktur erstellen jedoch bleibt die Datei leer
Thema durchsuchen
Ansicht
Themen-Optionen

TXMLDocument Struktur erstellen jedoch bleibt die Datei leer

Ein Thema von TUX_der_Pinguin · begonnen am 5. Dez 2008 · letzter Beitrag vom 9. Dez 2008
Antwort Antwort
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#1

TXMLDocument Struktur erstellen jedoch bleibt die Datei leer

  Alt 5. Dez 2008, 11:26
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#2

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei

  Alt 5. Dez 2008, 16:58
Bis zu dem Zweiten/Alleinstehenden und eigentlich unnötigen XMLDoc.Active:=True; dürfte es keine Probleme geben,
aber aber was macht FormatXMLData?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#3

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei

  Alt 8. Dez 2008, 08:24
FormatXMLData() Mit dieser Funktion kann man die zuvor erstellte Struktur formatieren.

Also aus
<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.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei

  Alt 8. Dez 2008, 08:30
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?)
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei

  Alt 8. Dez 2008, 08:59
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#6

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei

  Alt 8. Dez 2008, 20:40
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
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

[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?
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
TUX_der_Pinguin

Registriert seit: 1. Jun 2005
Ort: Anholt (NRW)
609 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: TXMLDocument Struktur erstellen jedoch bleibt die Datei

  Alt 9. Dez 2008, 08:34
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:07 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz