Autor Beitrag
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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 :)


ausblenden volle Höhe 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

{ Lock-Datei auslesen }
  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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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.

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 491
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: 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:

ausblenden 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 ;)