Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Delphi Mal wieder: XML in TreeView einlesen (https://www.delphipraxis.net/39585-mal-wieder-xml-treeview-einlesen.html)

ringli 4. Feb 2005 19:29


Mal wieder: XML in TreeView einlesen
 
Hallo!

Ich möchte gerne XML für Konfigurationsdateien verwenden und nun versuche ich schon seit einigen Tagen (bis jetzt leider ziemlich erfolglos :-() eine XML-Datei in einen TreeView einzulesen. Dabei verwende ich folgenden Code:

Delphi-Quellcode:
var
  benutzer, anwendung : IXMLDOMNodeList;
  Node, subNode : IXMLDOMNode;
  i, j: integer;
  tv : TTreeNode;

begin
  xmldoc := CoDOMDocument40.Create;
  xmldoc.setProperty('NewParser', true);
  xmldoc.load(ExtractFilePath(ParamStr(0)) + 'test.xml');

  TreeView.Items.BeginUpdate;
  TreeView.Items.Clear;

  benutzer := xmldoc.documentElement.selectNodes('benutzer');
  anwendung := xmldoc.documentElement.selectNodes('benutzer/anwendung');

  for i:= 0 to benutzer.length - 1 do
    begin
      Node := benutzer.item[i].selectSingleNode('benutzername');
      tv := TreeView.Items.Add(nil, Node.text);
      for j:= 0 to anwendung.length - 1 do
        begin
          subNode := anwendung.item[j].selectSingleNode('anwendungsname');
          TreeView.Items.AddChild(tv, subNode.text);
        end;
    end;

  TreeView.Items.EndUpdate;

end;
Dies ist die einzulesende XML-Datei (kleiner Auszug):

Code:
<?xml version="1.0"?>
<programmname>
  <benutzer>
    <benutzername>ABCD</benutzername>
    <passwort>123456</passwort>
    <domain>Testdomain</domain>
    <anwendung>
      <anwendungsname>Anwendung 1</anwendungsname>
      <pfad>datei.exe</pfad>
      <parameter></parameter>
    </anwendung>
    <anwendung>
      <anwendungsname>Anwendung 2</anwendungsname>
      <pfad>datei.exe</pfad>
      <parameter></parameter>
    </anwendung>
  </benutzer>
  <benutzer>
    <benutzername>EFGH</benutzername>
    <passwort>654321</passwort>
    <domain>Blabla</domain>
    <anwendung>
      <anwendungsname>Anwendung 1</anwendungsname>
      <pfad>datei.exe</pfad>
      <parameter></parameter>
    </anwendung>
  </benutzer>
</programmname>
Was problemlos klappt ist das Einlesen der Benutzernamen. Prinzipell klappt auch das Einlesen des Namens der Anwendung. Nur wird hier leider der Fehler gemacht das jede eingetragende Anwendung jedem Benutzer im Treeview zugeordnet wird. Wie man an der XML-Datei sieht (bzw. sehen sollte falls ich hier keinen Fehler gemacht habe) sollte das aber nicht so sein. Hat einer von euch vielleicht eine Idee was ich hier falsch mache?

P.S.: Habe auch schon hier im Forum gesucht aber noch keine wirkliche Lösung für mein Problem gefunden.

MathiasSimmack 4. Feb 2005 20:42

Re: Mal wieder: XML in TreeView einlesen
 
Dein Fehler ist, dass du Benutzer und Anwendungen getrennt einliest. Das darfst du nicht tun, denn ich gehe mal davon aus, du willst den Benutzer als obersten Knoten, und darunter die Anwendungen, die auch bei ihm eingetragen sind.

Das heißt, du suchst mit einer "selectNodes"-Anweisung nach allen <benutzer>-Knoten. Die läufst du in der Schleife durch, und erst dann suchst du für jedes gefundene Item nach den <anwendung>-Knoten.

ringli 4. Feb 2005 23:21

Re: Mal wieder: XML in TreeView einlesen
 
Zitat:

...denn ich gehe mal davon aus, du willst den Benutzer als obersten Knoten, und darunter die Anwendungen, die auch bei ihm eingetragen sind.
Ja, das hast du richtig erkannt. :-D

Ich hab jetzt 2 Stunden versucht rauszufinden wie du deinen Tip gemeint hast. Bis jetzt bin ich aber noch nicht wirklich dahintergekommen. :gruebel:

Hast du vielleicht noch ein bisschen Code für mich? :oops:

ringli 5. Feb 2005 08:46

Re: Mal wieder: XML in TreeView einlesen
 
Inzwischen bin ein bisschen weiter, aber leider wird jetzt immer nur die erste Anwendung ausgelesen. :-(
Delphi-Quellcode:
 
benutzer := xmldoc.documentElement.selectNodes('benutzer');

for i:= 0 to benutzer.length - 1 do
  begin
    Node := benutzer.item[i].selectSingleNode('benutzername');
    tv  := TreeView.Items.Add(nil, Node.text);

    if(Node.childNodes.length > 0) then
      for j := 0 to Node.childNodes.length - 1 do
        begin
          subNode := benutzer.item[i].selectSingleNode('anwendung/anwendungsname');
          TreeView.Items.AddChild(tv, subNode.text);
        end;
    end;

MathiasSimmack 5. Feb 2005 09:07

Re: Mal wieder: XML in TreeView einlesen
 
Jetzt ohne Garantie, dass es gleich auf Anhieb 100% korrekt ist:
Delphi-Quellcode:
ul   := xmldoc.selectNodes('/programmname/benutzer/benutzername');
for i := 0 to ul.length - 1 do
begin
  // Benutzernamen im Knoten "ul.items[i].text" in den Tree-View
  // eintragen
  { ... }

  // Parentknoten nehmen, und von dem die <anwendung>-Knoten
  // ermitteln
  al := ul.items[i].parentNode.selectNodes('anwendung/anwendungsname');
  // bei "parentNode" bin ich gerade nicht sicher, und ich bin
  // auch zu faul, deswegen ins PSDK zu gucken

  // wie dem auch sei, die ermittelten Anwendungen als
  // Children des TV-Knotens eintragen
  for j := 0 to al.length -1 do
  begin
    { ... }
  end;
end;
Guck mal ob dir das irgendwie weiterhilft. :)

ringli 5. Feb 2005 09:56

Re: Mal wieder: XML in TreeView einlesen
 
Es funktioniert! :dancer:
Vielen, vielen Dank für deine Hilfe! :thumb:


Hier jetzt noch der funktionierende Code:

Delphi-Quellcode:
benutzer   := xmldoc.selectNodes('/programmname/benutzer/benutzername');
for i := 0 to benutzer.length - 1 do
  begin
    tv  := TreeView.Items.Add(nil, benutzer.item[i].text);

    anwendung := benutzer.item[i].parentNode.selectNodes('anwendung/anwendungsname');
    for j := 0 to anwendung.length -1 do
      begin
        TreeView.Items.AddChild(tv, anwendung.item[n].text);
      end;
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz