![]() |
Teilstring in Textdatei ändern
Hallo,
ich habe eine Datei "C:\temp\Test.001" in der ich zur Laufzeit meines Programms an einer bestimmten Stelle etwas ändern muss. Der Inhalt der Datei sieht ungefähr immer wie folgt aus: Wichtig für mich ist die Zeile <StoreProperties DocumentName="Testdokument" />
Code:
Nun muss ich zur Laufzeit meines Programms den Eintrag in den Anführungsstrichen bei
<DWDocument DW5BasketFileName="Test.001">
<FileInfos> <ImageInfos> <ImageInfo id="0,0,0" nPages="0"> <FileInfo fileName="c:\Test\Test.DWTiff" dwFileName="Test.DWTiff" type="normal" /> </ImageInfo> </ImageInfos> </FileInfos> <Section number="0" startPage="0" dwguid="f8494ff5-109f-46a5-b721-08a3be0a67b1"> <Metadata version="0"> <SystemProperties> <DiskNo>0</DiskNo> <PageCount>0</PageCount> <Flags>2</Flags> </SystemProperties> <FieldProperties /> <StoreProperties DocumentName="Testdokument" /> </Metadata> <Page number="0"> <Rendition type="original"> <Content id="0,0,0" pageNumberInFile="0" /> <Annotation> <DW4CheckSum dwCheckSum="3652845198" dwDate="121402505" /> </Annotation> </Rendition> </Page> </Section> </DWDocument <StoreProperties DocumentName="Testdokument" /> durch einen neuen Wert (z.B.123456789) ersetzen. Kann mir bitte jemand sagen, wie soetwas am besten geht? Ich bedanke mich schonmal im Vorraus für jede Hilfe. CU Bea |
Re: Teilstring in Textdatei ändern
Du könntest die ganze Datei in eine Strinlist laden
Delphi-Quellcode:
vielleicht geht ja auch was mit xml, da kenne ich mich aber nicht mit aus.
var
sl: TStringlist; pos: Byte; begin sl:=TStringList.create; sl.loadfromFile('deinFile'); pos:=sl.strings.indexof('<StoreProperties DocumentName="Testdokument" />'); sl.string[pos]:='<StoreProperties DocumentName="was immer du willst" />'); sl.savetoFile('deinFile'); sl.free; end; Grüße Klaus [edit] delphi tags gesetzt |
Re: Teilstring in Textdatei ändern
Das Wort "Testdokument" ist hier doch nur ein Beispiel.
Ich kenne doch den ursprünglichen Eintrag zwischen den Anführungszeichen zur Laufzeit nicht. Mit XML hab ich auch noch nie was gemacht und weiß eben auch nicht, ob und wie das hierfür überhaupt gehen würde. CU Bea |
Re: Teilstring in Textdatei ändern
Delphi-Quellcode:
DeineSuchBezeichnung:=edit1.text; //string
DeineBezeichnung:=edit2.text; //string idx:=sl.strings.indexof('<StoreProperties DocumentName="'+deineSuchBezeichnung+'">'); sl.strings[pos]:='<StoreProperties DocumentName="'+deineBezeichnung+'">'; oder
Delphi-Quellcode:
so kannst Du auch einen Teilstring in der Liste suchen.
mit i : Byte;
for i:=0 to sl.count -1 do begin if pos('<StoreProperties DocumentName=',sl.strings[i]) <> 0 then idx:=pos('<StoreProperties DocumentName=',sl.strings[i]); end; Grüße Klaus |
Re: Teilstring in Textdatei ändern
Hallo Bea,
selbstverständlich ist das ein XML-Problem. Du kannst direkt auf dem MSXML Parser aufsetzen oder die Borland Komponente TXMLDocument verwenden. Du solltest eventuell die von dir verwendete Delphi-Version in dein DP-Profil eintragen. Grüße vom marabu |
Re: Teilstring in Textdatei ändern
Hallo Klaus,
irgendwie verstehst du nicht, was ich meine. Ich weiß zur Laufzeit nie, was in den Anführungszeichen steht. Ich kriege nur die Datei und weiß, dass ich dort genau an der Stelle zwischen den Anführungszeichen <StoreProperties DocumentName="blablabla" /> einen von mir erzeugten Wert einschreiben muss. Ich könnte als Suchkriterium also maximal das Stück <StoreProperties DocumentName= benutzen. Deshalb weiß ich ja auch nicht, wie ich das so richtig anstellen soll. Bei XML hab ich mal was von Tags gehört, aber was ist das, wie geht das und kann man diese Datei überhaupt mit XML- Zeugs behandeln? CU Bea |
Re: Teilstring in Textdatei ändern
marabu hat geschrieben das geht mit XML und ich denke da hat er wohl auch recht.
Ansonsten geht es auch so:
Delphi-Quellcode:
Grüße
mit i : Byte;
for i:=0 to sl.count -1 do begin // wenn <StoreProperties DocumentName= in dem String gefunden wird // merke die Position (idx) if pos('<StoreProperties DocumentName=',sl.strings[i]) <> 0 then idx:=pos('<StoreProperties DocumentName=',sl.strings[i]); end; // ersetze an Position idx den String durch einen neuen sl.strings[idx]:='<StoreProperties DocumentName="'+'deineBezeichnung">'; Klaus |
Re: Teilstring in Textdatei ändern
Kurz vor dem Abtauchen noch das hier:
Delphi-Quellcode:
marabu
uses
XMLIntf, XMLDoc; function XMLChange(markup, ePath, aName, oldValue, newValue: String): String; var doc: IXMLDocument; nl: IDOMNodeList; e: IDOMElement; i: Integer; s: String; begin doc := LoadXMLData(markup); with doc.DOMDocument as IDOMNodeSelect do nl := SelectNodes(ePath); for i := 0 to Pred(nl.length) do begin e := nl.item[i] as IDOMElement; s := e.getAttribute(aName); if CompareText(s, oldValue) = 0 then e.setAttribute(aName, newValue); end; Result := doc.XML.Text; end; |
Re: Teilstring in Textdatei ändern
@marabu
und wenn sie den oldvalue nicht kennt? Grüße Klaus |
Re: Teilstring in Textdatei ändern
Kenn mich mit XML ja och kaum aus, aber meiner Meinung nach sollte es doch möglich sein nach dem "Feld" (oder wie man dat zwischen "<" und ">" nennt) "StoreProperties" zu suchen und dort dem "Parameter"? einfach einen neuen wet zuzuweisen, dafür bäuchte man ja theoretsch nicht zu wissen was da überhaupt drinsteht?
|
Re: Teilstring in Textdatei ändern
Zitat:
Dann schaust Du, was dann passiert. Anschliessend liesst Du die Hilfe zu der XML-Kompo. Vermutlich kannst Du dann auf sehr einfache Weise den 'DocumentName' ändern. Dann die Datei wieder mit der XML-Kompo speichern und feddisch. |
Re: Teilstring in Textdatei ändern
also doch XML...na das muss ich mal in Ruhe probieren...noch nie gemacht.
und wie gesagt...oldValue kenn ich doch nicht :-( |
Re: Teilstring in Textdatei ändern
Zitat:
Da kann man viele schöne Sachen damit machen. und vermutlich brauchst Du den oldValue nicht, da Du dich auf 'DocumentName' stürzen solltest. |
Re: Teilstring in Textdatei ändern
Hallo ihr Spaßvögel,
wenn oldValue nicht bekannt ist, dann schraubt man die Funktionalität einfach etwas zurück:
Delphi-Quellcode:
Einfach mal ausprobieren...
uses
XMLIntf, XMLDoc; function XMLChange(markup, ePath, aName, aValue: String): String; var doc: IXMLDocument; nl: IDOMNodeList; i: Integer; begin doc := LoadXMLData(markup); with doc.DOMDocument as IDOMNodeSelect do nl := SelectNodes(ePath); for i := 0 to Pred(nl.length) do with nl.item[i] as IDOMElement do setAttribute(aName, aValue); Result := doc.XML.Text; end; marabu |
Re: Teilstring in Textdatei ändern
Hallo marabu,
wie verwende ich nun diese Funktion? Was muss denn da nun bei markup, ePath, aName, aValue rein? Hab da irgendwas von Knoten usw. gelesen, blick aber noch nicht so richtig durch. Keinen Plan :-( Könntest du mir da mal ein Aufruf für mein Beispiel dazupacken, bitte? CU Bea |
Re: Teilstring in Textdatei ändern
Hallo Bea,
hilft dir das?
Delphi-Quellcode:
Freundliche Grüße vom marabu
with TStringList.Create do
begin LoadFromFile(ParamStr(1)); Memo.Text := XMLChange(Text, '//StoreProperties', 'DocumentName', 'Bea'); Free; end; |
Re: Teilstring in Textdatei ändern
Hallo marabu,
vielen Dank für deine Hilfe. :thumb: Habe mich die letzten Tage mal etwas mit XML beschäftigt und mir viele Beispiele aus dem Forum angeschaut und ausprobiert, um das ganze Thema verstehen zu lernen. ... werd ich aber noch viel üben müssen :gruebel: Mit dem Beispiel von Dir konnte ich meine Anfrage lösen, denke ich. Ich habe das jetzt so umgesetzt:
Delphi-Quellcode:
Könnte ich diese Funktion nun eigentlich auch (sicherlich etwas abgeändert) verwenden,
procedure TForm1.Button1Click(Sender: TObject);
var xmlDoc: IXMLDocument; xmlFile: string; bXMLChange: boolean; begin with TStringList.Create do begin xmlFile := 'C:\DOCU0001.001'; LoadFromFile(xmlFile); if XMLChangeAttribute(xmlFile, Text, '//StoreProperties', 'DocumentName', '123456789') then bXMLChange := true else bXMLChange := false; Free; end; end; function XMLChangeAttribute(sFile, markup, ePath, aName, aValue: string): boolean; var doc: IXMLDocument; nl: IDOMNodeList; i: Integer; begin Result := true; doc := LoadXMLData(markup); try with doc.DOMDocument as IDOMNodeSelect do nl := SelectNodes(ePath); for i := 0 to Pred(nl.length) do with nl.item[i] as IDOMElement do begin setAttribute(aName, aValue); doc.SaveToFile(sFile); end except Result := false; end; end; um Werte bestimmter Knoten zu ändern? Also nochmals vielen Dank CU Bea |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:45 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