Autor |
Beitrag |
trm
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Mo 30.08.10 23:33
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 ?
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
elundril
      
Beiträge: 3747
Erhaltene Danke: 123
Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
|
Verfasst: Di 31.08.10 02:00
Mit JvSimpleXML könnte man über ne Schleife an die ganzen Sections rankommen, glaub ich.
lg elundril
_________________ This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 31.08.10 10:46
Meine SJ Config Utils haben einen AccessManager, der für INIs wie für XML funktioniert:
www.delphi-forum.de/viewtopic.php?t=92348
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: Di 31.08.10 16:40
Ich will erstmal zum Sport, gucke mir das nachher nochmal an.
Danke erstmal 
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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
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; |
Einloggen, um Attachments anzusehen!
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
trm 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
jaenicke
      
Beiträge: 19326
Erhaltene Danke: 1749
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: 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 
      
Beiträge: 491
Erhaltene Danke: 19
Windows 7x64
Delphi 7
|
Verfasst: 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.
Einloggen, um Attachments anzusehen!
_________________ In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege
|
|
|