Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   XML Endtag finden (https://www.delphipraxis.net/197651-xml-endtag-finden.html)

Pader1305 24. Aug 2018 10:36

Delphi-Version: 10.1 Berlin

XML Endtag finden
 
Hallo Zusammen,

Weiß jemand, ob es mit irgendeiner Funktion möglich ist den allerletzten Tag einer XML-Datei zu finden und vor diesen einen XML-Eintrag zu erstellen?
Ich hoffe meine Frage ist konkret genug formuliert. :-D

Über jeden Hinweis würde ich mich riesig freuen.

Uwe Raabe 24. Aug 2018 10:49

AW: XML Endtag finden
 
Vielleicht so:
Delphi-Quellcode:
const
  FileName = 'MyXmlFile.xml';
var
  N: Integer;
  S: string;
begin
  S := TFile.ReadAllText(FileName);
  N := S.LastIndexOf('</');
  if N >= 0 then begin
    TFile.WriteAllText(FileName, S.Insert(N, '<MyTag>MyValue</MyTag>'));
  end;
end;

Pader1305 24. Aug 2018 11:59

AW: XML Endtag finden
 
Vielen Dank schonmal für Ihre Antwort! :wink:

Vielleicht verdeutlicht eine Beispiels XML-Datei nocheinmal mein Problem.

Code:
<test>
   //Anderer Code
</test>

<test>
   //Anderer Code
</test>

<test>
   //Hier soll der entsprechende Code hinzugefügt werden
</test>
Ich weiß allerdings nicht, wie ich nur in den letzten Test-Tag etwas reinschreiben kann

mkinzler 24. Aug 2018 12:30

AW: XML Endtag finden
 
Etwas erweitert:

Delphi-Quellcode:
const
  FileName = 'MyXmlFile.xml';
var
  N, N2: Integer;
  S: string;
begin
  S := TFile.ReadAllText(FileName);
  N := S.LastIndexOf('</');
  if N >= 0 then begin
    N2 := S.IndexOf( '>', N)+1;
    TFile.WriteAllText(FileName, S.Insert(N2, '<MyTag>MyValue</MyTag>'));
  end;
end;

Uwe Raabe 24. Aug 2018 12:46

AW: XML Endtag finden
 
Zitat:

Zitat von Pader1305 (Beitrag 1411550)
Vielleicht verdeutlicht eine Beispiels XML-Datei nocheinmal mein Problem.

Auf dieses Beispiel angewendet erzeugt mein Code-Beispiel folgendes:
Code:
<test>
   //Anderer Code
</test>

<test>
   //Anderer Code
</test>

<test>
   //Hier soll der entsprechende Code hinzugefügt werden
<MyTag>MyValue</MyTag></test>

Zitat:

Zitat von mkinzler (Beitrag 1411552)
Etwas erweitert:

Mit dem Code wird der Textblock aber nach dem letzten End-Tag eingefügt, was einem simplen Append ziemlich nahe kommt.

Der schöne Günther 24. Aug 2018 13:09

AW: XML Endtag finden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Ich will ja nichts schlechtreden, aber textbasiert XML bearbeiten finde ich etwas fahrlässig. Vor allem wenn das in Delphi doch so einfach geht:

Delphi-Quellcode:
implementation

uses XmlIntf, XmlDoc;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
   xmlDoc:      IXMLDocument;
   lastNode:   IXMLNode;
begin
   xmlDoc := LoadXMLData(Memo1.Text);
   lastNode := xmlDoc.DocumentElement.ChildNodes.Last();
   // Mach was mit lastNode...
   lastNode.AddChild('thisIsANewNode');

   Memo2.Text := xmlDoc.XML.Text;
end;

Pader1305 24. Aug 2018 13:40

AW: XML Endtag finden
 
Danke nochmal für eure Antworten, das hat mir auf jeden Fall schonmal weitergeholfen!:)

Allerdings hab ich soeben bemerkt, dass der Fehler schon woanders liegt und zwar im Laden der Datei.

Code:

XMLDocument1.LoadFromFile(FILEPATH);
Dort haut er mir bereits einen Fehler raus, da die Struktur der XML-Datei folgendermaßen aussieht und ich diese auch nicht verändern kann.

Code:

<?xml version="1.0" encoding="utf-8"?>

<Beispiel>

</Beispiel>

<Beispiel>

</Beispiel>
Die Datei, die geladen wird hat keinen übergeordneten Knotenpunkt und diese Datei liegt so auf einem Server vor. Wenn allerdings ein übergeordneter Knoten vorhanden ist, dann funktioniert alles einwandfrei.
Ich schätze da lässt sich nicht viel machen, korrekt?

Der schöne Günther 24. Aug 2018 13:48

AW: XML Endtag finden
 
Wenn man kein gültiges XML hat kann man auch keinen XML-Parser bemühen :(

Pader1305 24. Aug 2018 13:51

AW: XML Endtag finden
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1411557)
Wenn man kein gültiges XML hat kann man auch keinen XML-Parser bemühen :(

Ja, in der Tat. Ist nur sehr ärgerlich, dass mir das so spät auffällt. :|

Bin noch ganz neu in der Delphi-Programmierung. Wie sieht das denn aus, wenn man, wie die Vorgänger bereits erwähnten, die Datei stumpf als Textdatei ausliest, dann den entsprechenden Teil einfügt und schließlich als XML-Datei abspeichert?

Delphi.Narium 24. Aug 2018 13:53

AW: XML Endtag finden
 
Bin mal naiv:

Datei in 'ne Stringliste laden und ein bisserl anpassen, ungefähr sinngemäß sowas:
Delphi-Quellcode:
var
  sl : TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile(FILEPATH);
  sl.Insert(1,'<reparaturtag>');
  sl.Add('</reparaturtag>');
  sl.SaveToFile(FILEPATH);
  sl.Free;
Sinnvoller wäre es, beim "Lieferanten" die Erstellung einer syntaktisch korrekten Datei einzufordern.

Pader1305 24. Aug 2018 13:56

AW: XML Endtag finden
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1411559)
Bin mal naiv:

Datei in 'ne Stringliste laden und ein bisserl anpassen, ungefähr sinngemäß sowas:
Delphi-Quellcode:
var
  sl : TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile(FILEPATH);
  sl.Insert(1,'<reparaturtag>');
  sl.Add('</reparaturtag>');
  sl.SaveToFile(FILEPATH);
  sl.Free;
Sinnvoller wäre es, beim "Lieferanten" die Erstellung einer syntaktisch korrekten Datei einzufordern.


Das ist auch ein Lösungsvorschlag. Ich werde das mal durchsprechen, aber ein großes Dankeschön schonmal!:)

Delphi.Narium 24. Aug 2018 13:57

AW: XML Endtag finden
 
Wenn ich die Aufgabenstellung recht verstanden habe, muss bei den Dir vorliegenden Dateien immer in die vorletzte Zeile was eingefügt werden:
Delphi-Quellcode:
var
  sl : TStringList;
begin
  sl := TStringList.Create;
  sl.LoadFromFile(FILEPATH);
  sl.Insert(sl.Count - 1,'<myTag>irgendein Inhalt</myTag>');
  sl.SaveToFile(FILEPATH);
  sl.Free;
end;

Pader1305 27. Aug 2018 12:39

AW: XML Endtag finden
 
Hallo nochmal,
Ich habe den folgenden Code nun verwendet, kann leider aber nicht überprüfen, ob er funktioniert

Delphi-Quellcode:

var
   lStringListDatei : TStringList;
   
    begin
      lStringListDatei.Encoding.UTF8;
      lStringListDatei.LoadFromFile(lConfig.getXMLDatabase, TEncoding.UTF8);
      lStringListDatei.Insert(1,'<test>');
      lStringListDatei.Add('</test>');
      lStringListDatei.SaveToFile(lConfig.getXMLDatabase, TEncoding.UTF8);

    end;
Ich bekomme nur eine 'access violation at 0x004b7038: write of Adress': Fehlermeldung und werde dort hin verwiesen mit einer Markierung in die FDefaultEncoding Zeile.
Delphi-Quellcode:
{ TStrings }

constructor TStrings.Create;
begin
  inherited Create;
  FDefaultEncoding := TEncoding.Default;
  FLineBreak := sLineBreak;
  FDelimiter := ',';
  FQuoteChar := '"';
  FNameValueSeparator := '=';
  FOptions := [soWriteBOM, soTrailingLineBreak, soUseLocale];
end;

Delphi.Narium 27. Aug 2018 12:46

AW: XML Endtag finden
 
Du musst lStringListDatei erstellen und wieder freigeben.
Delphi-Quellcode:
begin
  lStringListDatei := TStringlist.Create;
  // dein Code
  lStringListDatei.Free;
end;


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