![]() |
XML IniFiles
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
im Zuge eines größeren Programmes, war ich "gezwungen" meine ini-Datei als XML zu speichern. Deshalb hab ich mir eine Klasse dazu geschrieben. Da ich hier schon oft gelesen habe, das man doch ini-Files als XML speichern soll, dachte ich mir, dass ich die Klasse auch gleich mal veröffentlich kann. Die Klasse heißt TXMLIniFile aus der Unit XMLIniFiles. Sie ist von der TCusotmIniFile abgeleitet und benötigt die MSXML2_TLB. Sie ist "Copy and Paste" fähig. Das heißt man kann sie genauso handhaben wie die normale TIniFile, sie reagiert gauso wie in der Dokumentation der TIniFile beschrieben und es sind keine Änderungen (außer natürlich die Klassen austauschen :wink: ) im bestehenden Code nötig. Deshalb verzichte ich auch auf ein Tutorial oder Demo. Vielleicht kann sie der ein oder andere gebrauchen. Über Fragen, Anregungen und Kritik freue ich mich natürlich. :-D [edit]Neue Version[/edit] |
Re: XML IniFiles
Ein großes Problem gib es:
Nimm mal Namen für "Section" oder "Ident", welche nicht den Namenskonventionen für einen XML-Node entsprechen ....... dann knallt's und MSXML haut dir Exceptions um die Ohren! z.B. ein Leerzeichen im Namen oder ein Name, welcher mit einer Zahl beginnt aber sonst sieht es anscheinend OK aus :thumb: darum hier mal der Aufbau meiner XML als Vorschlag
XML-Code:
(hab in meinem himXML auch soeine Klasse, nur daß ich da halt eine andere XML-Klasse verwende und einige der Typen/Strings selber umgewandele, damit sie mehr mit dem allgemeinen Aufbau/Verständnis von vielen XML-Parsern übereinstimmen, wie z.B. das Format der Datums-Strings)
<?xml ... ?>
<ini> <section name="{sectionName}"> <ident name="{identName}">{value}</ident> ... </section> ... </ini> [edit] da jemand der Meinung war ich solle doch ... Matze: An deiner Stelle hätte ich "himXML" verlinkt. Dann ist es gleichzeitig bessere Werbung ;) himitsu: ich wollt ihm nur den Namen nennen, falls er selber nachsehn will und als Quellenangabe für die gepostete XML Matze: vllt denkt er, das sei was internes von dir, das nicht Open-Source ist. Daher die verlinkung. Aber is au net tragisch. War nur son Geheimtip ^^ ![]() aber bezüglich der Werbung: vor Delphi 2006 und für alle, die nur eine Kleine Ini-Unit einbinden wollen, würde ich deines empfehlen (also wenn du dann das Problemchen mit dem Leerzeichen beseitigt hast, da dieses doch schon öfter mal in solchen Namen vorkommen) |
Re: XML IniFiles
:wall:
Da hast du natürlich recht. Daran hab ich gar nicht gedacht. :oops: Naja, neue Version ist hochgeladen und das Problem sollte jetzt weg sein. Dein Beispiel ist am besten und hab das auch gleich als Vorlage genommen. Ich hätts auch nich anders gemacht. :-D Dein himXML ist ja hier in der DP nicht zu übersehen und ich weiß, dass da so eine Klasse dabei ist. Aber ich muss zugeben, ich habs mir trotzdem noch nie angeguckt. :duck: Aber ich schreib XML zeugs lieber selber. Da weiß ich was ich hab und kann das perfekt für mein Programm optimieren. Wer noch Fehler findet, kann sie natürlich posten. |
Re: XML IniFiles
Moin, Moin.
Habe das mal an meinem "rzDelphiGuide" ausprobiert - es funktioniert ohne Probleme. Ich stelle mir allerdings die Frage, was ist besser an XmlIniFile als an dem uralten IniFile? Kann eigentlich nur feststellen: Die INI-Datei wird in meinem Fall etwa 25% größer und unleserlich?
|
Re: XML IniFiles
Nja, ich seh einfach den Vorteil darin, daß man leicht älte Projekte, welche noch als INI speichern auf XML umstellen kann, um dann in neueren Projekten dann richtig mit XML weiterzuarbeiten.
Im grunde umgeht man damit einige Probleme der INI - Größenbeschränkung (OK, dafür gibt es andere Klassen) - und du kannst in der XML auch Daten speichern, welche in die INI garnicht reinpassen Hier mal ein einfaches Beispiel für mehrzeiligen Text: uses IniFiles;
Delphi-Quellcode:
Dieser steht dann zwar in der INI drin, aber läßt sich nicht mehr auslesen,
procedure TForm1.FormCreate(Sender: TObject);
var ini: TIniFile; begin ini := TIniFile.Create(ChangeFileExt(Application.ExeName, '.ini')); ini.WriteString('section', 'ident', 'mehrzeiliger'#13#10'Text'); Memo1.Text := ini.ReadString('section', 'ident', ''); ini.Free; end; da Value nur bis Zeilenende ausgelesen wird.
Code:
Es ist also gut um ein altes Projekt "aufzurüsten", ohne viel ändern zu müssen,
[section]
ident=mehrzeiliger Text oder für Leute, die zwar "aufrüsten" und mit XML arbeiten wollen, aber sich einfach nicht trauen (angst haben, daß sie es nicht schaffen) und dann praktisch die XML genauso handhaben, als wäre sie eine bekannte INI. |
Re: XML IniFiles
Zitat:
Offen ist noch meine Frage: Mit welchem Programm man sich so eine XML-Datei vernünftig anzeigen lassen? Mit Notpad & Co. ist das nicht so prickelnd was man zu sehen bekommt. |
Re: XML IniFiles
himXML selber ist eine eigenständige XML-Implementation ... ähnlich wie das MSXML-DOM, welches hier verwendet wurde.
(bin allerdings noch in der Aufbau.Phasen dieser Klassen) Die TXMLIniFile (hey, unsere Klassen heißen sogar gleich :mrgreen: ) macht im Grunde auch das, welches hier gemacht wurde, nur das es eine andere XML-Implementation im Hintergrund verwendet. |
Re: XML IniFiles
... dann gibt es in himXML (TXMLIniFile) noch keine fertigen Methoden um z.B. ein Integer-Array zu speichern bzw. zu lesen? Wenn nicht, ist das geplant?
|
Re: XML IniFiles
Zitat:
Es ist auch dort nur das umgesetzt, welches in der original TIniFile drin steckt Also du kannst einen Stream speichern. Ansonsten müßte ich eigentlich nur meine Serialisierung durchschleifen. in himXML selber gibt es ja eine Serialisierung für Records (welche Arrays enthalten können) und Variants (die für Objekte kann immernoch nicht das einmal Gespeicherte auslesen, bzw. der Code dafür ist noch nicht freigegeben) Also was die Funktionen der originalen TIniFile angeht, ist der Code von hier natürlisch schön klein und übersichtlich und bietet das Selbe wie meine Klassen :-D |
Re: XML IniFiles
Meine TXMLIniFile ist wirklich nur für den Umstieg auf XML geeignet. Für ein neues Projekt würde ich es auch "richtig" machen. Erst recht wenn man sowieso himXML verwenden will. Obwohl, wenn man nichts großartiges Initialisieren will, geht das schon.
Zitat:
![]() Zitat:
Zitat:
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 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