ReadSections wie aus TIniFiles für XML-Dateien?
spacer
Autor Nachricht
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 273
Erhaltene Danke: 5

Windows 7x64
Delphi 7
BeitragVerfasst: Mo 30.08.10 22: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 ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.


Werbung ausblenden? Dann registriere Dich kostenlos. Weitere Gründe für eine Registrierung.
elundril
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic starofftopic star
Beiträge: 3739
Erhaltene Danke: 118

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Di 31.08.10 01: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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15429
Erhaltene Danke: 674

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Di 31.08.10 09: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
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 273
Erhaltene Danke: 5

Windows 7x64
Delphi 7
BeitragVerfasst: Di 31.08.10 15: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 ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15429
Erhaltene Danke: 674

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Mi 01.09.10 02: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 markieren
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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 273
Erhaltene Danke: 5

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 01.09.10 09: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 markieren
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 ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 273
Erhaltene Danke: 5

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 01.09.10 20: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 markieren
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 ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 15429
Erhaltene Danke: 674

XP, W7 x64 (Chrome, IE9, FF), Debian, (OSX 10.7)
RAD XE 2, Java (NB), C++, C# (VS 2010), JS/HTML, PHP, Lazarus
BeitragVerfasst: Do 02.09.10 05: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.
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starhalf offtopic star
Beiträge: 273
Erhaltene Danke: 5

Windows 7x64
Delphi 7
BeitragVerfasst: Do 02.09.10 13: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 markieren
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 ;)
 
Antworten mit Zitat Beitrag melden
Private Nachricht sendenPosting in privater Nachricht zitieren
home home