Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi XML : Zeile überschreiben -> schreibt komplette Datei neu (https://www.delphipraxis.net/190830-xml-zeile-ueberschreiben-schreibt-komplette-datei-neu.html)

Freyr77 11. Nov 2016 14:44

Delphi-Version: 10 Seattle

XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Delphi-Quellcode:
var
  lNodeHelper: TNodeHelper;
  lXMLDocument: IXMLDocument;
  lTmpNode: IXMLNode;
  lTmpOutput: string;
  iCounter: integer;
  lnewProductVersion: string;
  lChkBox: TGridCheckbox;

begin
  if MessageDlg
    ('Die veränderten Daten werden fest gespeichert, wollen Sie fortfahren?',
    mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    for iCounter := 1 to fProjectListItems.Count do
    begin
      lChkBox := gridDataSet.Objects[PROJ_CHECKBOXES, iCounter]
        AS TGridCheckbox;

      if Assigned(lChkBox) AND lChkBox.Checked then
      begin
        lNodeHelper := gridDataSet.Objects[PROJ_NODEHELPER, iCounter]
          AS TNodeHelper;
        lXMLDocument := lNodeHelper.FDocument;
        lTmpNode := lNodeHelper.FNode;
        lTmpOutput := lTmpNode.NodeValue;

        lnewProductVersion := XMLHandle.getNewProductVersion('ProductVersion',
          lTmpOutput, gridDataSet, iCounter);
        lTmpNode.NodeValue := XMLHandle.getNewFileVersion('FileVersion',
          lnewProductVersion, gridDataSet, iCounter);

        lXMLDocument.SaveToFile(fProjectListItems[iCounter - 1]);
      end;
    end;
  end
  else
    Exit;

  ShowMessage('Die Änderungen wurden erfolgreich übernommen.');
end;
Ich möchte mit diesem Code XMLs von .pas-Dateien überschreiben. Und zwar nur eine bestimmte Zeile mit einem bestimmten Knoten(<>blablabla</> - sowas..). Dort werden über das Programm die Datei- und Produktversionen aktualisiert. Das funktioniert auch alles wie es soll.

Wenn ich allerdings in Git Extensions auf die Änderungen schau, ist der komplette Text ersetzt worden. Zwar stimmt trotzdem was eingetragen wurde, es ist aber nicht gewollt das der Code immer die komplette Datei überschreibt.

Weiß jemand zufällig woran das liegen kann?

TiGü 11. Nov 2016 14:57

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Zitat:

Zitat von Freyr77 (Beitrag 1353381)
Weiß jemand zufällig woran das liegen kann?

Ja!
lXMLDocument.SaveToFile schreibt immer die komplette Datei, d.h. den kompletten Baum als XML-Textdatei.

Freyr77 11. Nov 2016 14:59

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Zitat:

Zitat von TiGü (Beitrag 1353384)
Zitat:

Zitat von Freyr77 (Beitrag 1353381)
Weiß jemand zufällig woran das liegen kann?

Ja!
lXMLDocument.SaveToFile schreibt immer die komplette Datei, d.h. den kompletten Baum als XML-Textdatei.

DANKE! :lol: Ich hab mich wirklich krumm gesucht.

Kannst du mir zufällig auch sagen wie ich das korrekterweise ändern muss? Oder ist das nicht so einfach möglich?

TiGü 11. Nov 2016 15:05

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Ne, das wird so nicht gehen.

himitsu 11. Nov 2016 18:55

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Was heißt "komplette Datei geändert"?

Wenn du willst, dass es gleich aussieht, dann mußt du in der selben Formatierung speichern,
oder die Datei danach halt nochmal entsprechend umformatieren.
* Einrückung
* Zeilenumbrüche
* ...


Alternativ solltest du eben keinen Text-DIFF versenden, sondern einen XML-Diff, denn dann wird die Datei inhaltlich verglichen und nicht Zeilenweise, was sogesehn bei XMLs auch 'ne leicht blöde Idee ist.

Freyr77 14. Nov 2016 10:20

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Das Problem ist genau gesagt, dass er zwar alles richtig überschreibt, aber folgendes macht:

<Project xmlns="">
<PropertyGroup>
<ProjectGuid>{blabla}</ProjectGuid>

Im Original sind es zur Trennung der "Knoten" vor dem Text jeweils 4 Leerzeichen. Also vor der PropertyGroup habe ich 4 Leerzeichen, vor der ProjectGuide habe ich 8 Leerzeichen.

Im überschriebenen Zustand habe ich aber vor Property Group einen Tab, und vor Project Guide 2 Tabs.

Ich brauch also nur die Beibehaltung der Leerzeichen damit es passt.

DeddyH 14. Nov 2016 10:45

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Was machst Du denn mit der Datei, dass Du auf die korrekten Whitespaces achten musst? Normalerweise sollten die keine Rolle spielen.

Freyr77 14. Nov 2016 11:25

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Zitat:

Zitat von DeddyH (Beitrag 1353546)
Was machst Du denn mit der Datei, dass Du auf die korrekten Whitespaces achten musst? Normalerweise sollten die keine Rolle spielen.

Ich verändere Versions - und Produktnummer. Ich hab selbst keine Ahnung warum das so sein muss.

Ich hab es jetzt mal mit:

Delphi-Quellcode:
lXMLDocument.XML.Text := xmlDoc.FormatXMLData(lXMLDocument.XML.Text);
probiert.

Allerdings sagt er mir dann "kein Dokument aktiv".

DeddyH 14. Nov 2016 11:28

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Auszug aus einer meiner Sourcen:
Delphi-Quellcode:
  Doc.XML.Text := XMLDoc.FormatXMLData(Doc.XML.Text);
  (* Nach dem Formatieren wieder aktiv setzen, sonst Exception!! *)
  Doc.Active := true;
  Doc.SaveToStream(Stream);

Freyr77 14. Nov 2016 12:12

AW: XML : Zeile überschreiben -> schreibt komplette Datei neu
 
Zitat:

Zitat von DeddyH (Beitrag 1353552)
Auszug aus einer meiner Sourcen:
Delphi-Quellcode:
  Doc.XML.Text := XMLDoc.FormatXMLData(Doc.XML.Text);
  (* Nach dem Formatieren wieder aktiv setzen, sonst Exception!! *)
  Doc.Active := true;
  Doc.SaveToStream(Stream);

Ja, so funktioniert es.:thumb:

Leider formatiert er mir wieder "Tabs" rein anstatt die Leerzeichen. Was wohl daran liegt, dass es so Standardmäßig auch sein soll.

Ziel ist es übrigens, dass man in GIT-Extensions bei den Änderungen nur sieht, was genau geändert wurde, und nicht die komplette Datei einmal rot und einmal grün.


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