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. |
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; |
AW: XML Endtag finden
Vielen Dank schonmal für Ihre Antwort! :wink:
Vielleicht verdeutlicht eine Beispiels XML-Datei nocheinmal mein Problem.
Code:
Ich weiß allerdings nicht, wie ich nur in den letzten Test-Tag etwas reinschreiben kann
<test>
//Anderer Code </test> <test> //Anderer Code </test> <test> //Hier soll der entsprechende Code hinzugefügt werden </test> |
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; |
AW: XML Endtag finden
Zitat:
Code:
<test>
//Anderer Code </test> <test> //Anderer Code </test> <test> //Hier soll der entsprechende Code hinzugefügt werden <MyTag>MyValue</MyTag></test> Zitat:
|
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; |
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:
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.XMLDocument1.LoadFromFile(FILEPATH);
Code:
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.<?xml version="1.0" encoding="utf-8"?> <Beispiel> </Beispiel> <Beispiel> </Beispiel> Ich schätze da lässt sich nicht viel machen, korrekt? |
AW: XML Endtag finden
Wenn man kein gültiges XML hat kann man auch keinen XML-Parser bemühen :(
|
AW: XML Endtag finden
Zitat:
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? |
AW: XML Endtag finden
Bin mal naiv:
Datei in 'ne Stringliste laden und ein bisserl anpassen, ungefähr sinngemäß sowas:
Delphi-Quellcode:
Sinnvoller wäre es, beim "Lieferanten" die Erstellung einer syntaktisch korrekten Datei einzufordern.
var
sl : TStringList; begin sl := TStringList.Create; sl.LoadFromFile(FILEPATH); sl.Insert(1,'<reparaturtag>'); sl.Add('</reparaturtag>'); sl.SaveToFile(FILEPATH); sl.Free; |
AW: XML Endtag finden
Zitat:
Das ist auch ein Lösungsvorschlag. Ich werde das mal durchsprechen, aber ein großes Dankeschön schonmal!:) |
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; |
AW: XML Endtag finden
Hallo nochmal,
Ich habe den folgenden Code nun verwendet, kann leider aber nicht überprüfen, ob er funktioniert
Delphi-Quellcode:
Ich bekomme nur eine 'access violation at 0x004b7038: write of Adress': Fehlermeldung und werde dort hin verwiesen mit einer Markierung in die FDefaultEncoding Zeile.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;
Delphi-Quellcode:
{ TStrings }
constructor TStrings.Create; begin inherited Create; FDefaultEncoding := TEncoding.Default; FLineBreak := sLineBreak; FDelimiter := ','; FQuoteChar := '"'; FNameValueSeparator := '='; FOptions := [soWriteBOM, soTrailingLineBreak, soUseLocale]; end; |
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