Entwickler-Ecke
Dateizugriff - ReadSections wie aus TIniFiles für XML-Dateien?
trm - Mo 30.08.10 23:33
Titel: ReadSections wie aus TIniFiles für XML-Dateien?
Hat jemand schonmal eine Variante von ReadSections, welches man von TiniFiles kennt, für XML-Dateien umgesetzt?
Wenn ich GetPrivateProfileString auf eine XML-Datei anwende, erhalte ich keine Fehlermeldungen, aber auch kein Resultat. Ich denke das liegt an der Struktur, da keine [] gefunden werden.
Hat jemand hierzu eine Idee bitte?
Nachtrag:
Die einzelnen Sektionen/Nodes in der XML-Datei sind mir unbekannt, daher versuche ich es über diesen Weg.
Eine andere Variante ist sicherlich über eine StringList, jedoch ist hier sicherlich etliches an Parserdingen zu beachten, oder reicht es um die Nodes zu erhalten aus, Zeilenweise nach dem ersten < zu suchen ?
elundril - Di 31.08.10 02:00
Mit JvSimpleXML könnte man über ne Schleife an die ganzen Sections rankommen, glaub ich.
lg elundril
trm - Di 31.08.10 16:40
Ich will erstmal zum Sport, gucke mir das nachher nochmal an.
Danke erstmal :)
jaenicke - Mi 01.09.10 03:25
Dort direkt ist das nicht drin, aber du siehst wie der Zugriff auf XML z.B. aussieht.
Ich weiß nicht wie das bei dem Delphi-Wrapper ist, aber in MSXML selbst gibt es selectNodes. Dann geht sowas:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var MyNodes: IXMLDOMNodeList; begin MyNodes := MyParentNode.selectNodes('*'); for i := 0 to MyNodes.length - 1 do MyNodes[i].nodeName ... |
Ein genaues Beispiel kann ich machen, wenn ich den PC mit Delphi wieder repariert habe.
trm - Mi 01.09.10 10:04
Hallo,
Hier ist ein Auszuge aus meinem Tool. Im Anhang findet ihr das komplette Programm, welches ich erstmal als TEST auf die schnelle zusammengeschustert habe.
Bei der Erstellung der Nodes im XML-Dokument wurde von mir beachtet, dass keine Leerzeichen enthalten sind. Alle Leerzeichen werden vom eigentlichen Hauptprogramm als _ maskiert. Eventuell ändere ich die Maskierung später zu einem bestimmten String, um eine Übersetzung ins Original wieder zu ermöglichen. Doch dies ist im aktuellen Zustand nicht nötig.
Wer hier gravierende Fehler in meiner Lokig findet, den würde ich bitten, mir diese mitzuteilen :)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63:
| function Read_LockFile(_File: string; Alleanzeigen: Boolean = True): Boolean; var Dummy_Setup: TXMLConfig; Dummy_String: string; Dummy_StringList: TStringList; Dummy_TreeNode: TTreeNode; Dummy_Boolean: Boolean; x: Integer; begin
Result := True; Form1.TreeView1.Items.Clear; try
Dummy_StringList := TStringList.Create; Dummy_StringList.LoadFromFile(_File); for x := 0 to Dummy_StringList.Count - 1 do begin Dummy_StringList[x] := Trim(Dummy_StringList[x]); Dummy_String := Trim(Copy(Dummy_StringList[x], 2, Pos(#32, Dummy_StringList[x]) - 1));
if Length(Trim(Dummy_String)) > 0 then begin
Dummy_Setup := TXMLConfig.Create(_File); Dummy_Setup.Backup := False;
Dummy_Boolean := Dummy_Setup.ReadBoolean(Dummy_String, 'Computername', True);
if Dummy_Boolean or Alleanzeigen then begin Dummy_TreeNode := Form1.TreeView1.Items.Add(nil, Dummy_String); case Dummy_Boolean of True: Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Angemeldet: JA'); False: Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Angemeldet: Nein'); end;
Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Computername: ' + Dummy_Setup.ReadString(Dummy_String, 'ClientComputername', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Computer-Benutzer: ' + Dummy_Setup.ReadString(Dummy_String, 'ClientUser', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Computer-IP: ' + Dummy_Setup.ReadString(Dummy_String, 'ClientiP', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Benutzernummer: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUserNumber', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Benutzername: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUser', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Vorname: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUser_Vorname', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Nachname: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUser_Nachname', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Letztes Anmeldedatum: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUser_Date', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Letzte Anmeldezeit: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUser_Time', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Letztes Abmeldedatum: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUser_Date_LogOut', '')); Form1.TreeView1.Items.AddChild(Dummy_TreeNode, 'Letzte Abmeldezeit: ' + Dummy_Setup.ReadString(Dummy_String, 'Client_PCProgrammUser_Time_LogOut', ''));
Dummy_Setup.Free; end; end;
end; Dummy_StringList.Free; except Result := False; end;
end; |
trm - Mi 01.09.10 21:34
Hi.
Sebastian, kannst Du mir bitte mal versuchen hier zu helfen:
Ich habe die uCiaXml.pas versucht zu ändern und ein
ReadSections hinzuzufügen.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27:
| TXMLConfig = class private FModified: Boolean; FFileName: string; FXMLDoc: TXMLDocument; FBackup: Boolean; [..] public function ReadSections: TStrings; [..]
function TXMLConfig.ReadSections: TStrings; var NodeList: IXMLNodeList; x: Integer; begin
Result := nil; try NodeList := FXMLDoc.DocumentElement.ChildNodes; for x := 0 to NodeList.Count - 1 do if assigned(NodeList.Nodes[x])then Result.Add(NodeList.Nodes[x].Text); except end;
end; |
Bei der Zuweisung des Textes der Node wird immer eine Exception ausgelöst, kompiliert wird jedoch alles korrekt.
Ich denke, der Zeiger im Nodes[x].Text ist falsch - aber eich weiß nicht, warum.
Kannst Du das nachvollziehen?
Betrifft: Delphi7
jaenicke - Do 02.09.10 06:14
Ich kann derzeit nichts testen, da der PC, auf dem Delphi aktiviert ist, defekt ist. Der geht vermutlich erst am Wochenende wieder.
Ansonsten bliebe auf jeden Fall selectNodes ohne den Wrapper von Delphi, wenn du direkt auf das Interface von MS zugreifst.
trm - Do 02.09.10 14:03
Hi Sebastian,
ich habe (mal wieder) mich derart in eine Sache vertieft, dass ich einen logischen Fehler übersehen habe.
Bei meiner Parameterübergabe (Result = TStrings) habe ich vergessen, Result zu initialisieren. Daher kam es logischerweise immer zu einem Speicherfehler.
Anbei nun das aktuelle Projekt mit der Delphi-internen Wrappermöglichkeit, komplette Sectionen aus einer XML-Datei auszulesen.
Danke nochmal für Deine Hilfe, bin erstmal fertig mit diesem Thread :)
Edit: neues Archiv hochgeladen, die Function
function Read_LockFile(_File: string; Alleanzeigen: Boolean = True): Boolean; habe ich angepasst, jetzt können auch Nodes gelesen werden, die hintereinander stehen.
Beispiel:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| <Einstellungen> <MathiasPC_MF_192.168.10.0 PCProgrammUser_Time_LogOut="22:53:18"/><MathiasPC_MF_192.168.10.0 PCProgrammUser_Time_LogOut="22:53:18"/><MathiasPC_MF_192.168.10.0 PCProgrammUser_Time_LogOut="22:53:18"/>
<MathiasPC_MF_192.168.10.0 PCProgrammUser_Time_LogOut="22:53:18"/><MathiasPC_MF_192.168.10.0 PCProgrammUser_Time_LogOut="22:53:18"/>
<MathiasPC_MF_192.168.10.0 PCProgrammUser_Time_LogOut="22:53:18"/> </Einstellungen> |
Das sind 6 verschiedene Nodes, welche korrekt eingelesen werden.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!