AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein XML Delphi Combobox.SelText soll XML-Daten aus drei XML-Dateien holen ?
Thema durchsuchen
Ansicht
Themen-Optionen

Combobox.SelText soll XML-Daten aus drei XML-Dateien holen ?

Ein Thema von joredue · begonnen am 6. Aug 2004 · letzter Beitrag vom 11. Aug 2004
Antwort Antwort
joredue

Registriert seit: 10. Jul 2004
10 Beiträge
 
#1

Combobox.SelText soll XML-Daten aus drei XML-Dateien holen ?

  Alt 6. Aug 2004, 11:23
Hallo alle zusammen.

Leider hänge ich an einem Problem mit XML fest. Habe die Foren schon durch sucht, bin aber nich fündig geworden.

Mein Problem:
Ich habe vier XML-Dateien, die erste habe ich in Comboboxen eingelesen, (kein Problem).
Jetzt aber möchte ich, das wenn ich einen Eintrag aus einer dieser Comboboxen gewählt habe, das der dazu gehörende Satz oder Sätze (wird über eine "ID" gewährleistet) in einem Listview dargestellt wird.

Kann mir vielleicht jemand weiterhelfen oder auf die Sprünge helfen ?

Danke schon mal jetzt.
Cu Achim
  Mit Zitat antworten Zitat
joredue

Registriert seit: 10. Jul 2004
10 Beiträge
 
#2

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 9. Aug 2004, 17:40
Hallo alle zusammen.

Habs selbst hinbekommen.

Cu Achim
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 9. Aug 2004, 17:48
Schön für dich. Und wie?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
joredue

Registriert seit: 10. Jul 2004
10 Beiträge
 
#4

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 9. Aug 2004, 23:30
Hallo Luckie.

Leider zwar nicht wie gewünscht, will sagen, nicht in einem einzigen Listview, sondern auf drei Listviews verteilt, die ich in einem PageControl untergebracht habe. Nicht schön aber es funktioniert. Das Filtern ist recht einfach.

Delphi-Quellcode:
procedure TForm1.ComboBox5Change(Sender: TObject);
var
  StartKnoten : IXMLNode;
  ANode : IXMLNode;
  IDEENR, NAME, NACHNAME, KOMPLEX, GRUPPE : string;
begin
// Etwas fürs Auge für den User
   Screen.Cursor:=crHourglass;
// Löschen der Listviews
   lv.Clear;
   lv2.Clear;
   lv3.Clear;
// Lade XML-Dokument
   XMLKomplex.FileName := 'C:\KOMPLEX\TEST_NEU.XML';
// Setzen der Komponente TXMLDocument auf Active
   XMLKomplex.Active:=True;
// Start Knoten setzen
   StartKnoten := XMLKomplex.DocumentElement.ChildNodes.First.ChildNodes.FindNode('V_KOMPLEX');
   ANode := StartKnoten;
// Durchlaufen bis Ende erreicht wurde
   repeat
// Prüfen ob Wert aus ComboBox5 in XML-Datei
      if ANode.ChildNodes['IDEENR'].Text = ComboBox5.Text THEN
      begin
        IDEENR := ANode.ChildNodes['IDEENR'].Text;
        NAME := ANode.ChildNodes['NAME'].Text;
        NACHNAME := ANode.ChildNodes['NACHNAME'].Text;
        KOMPLEX := ANode.ChildNodes['KOMPLEX'].Text;
        GRUPPE := ANode.ChildNodes['GRUPPE'].Text;
// Eintragen in Listview
        with LV.Items.Add do
        begin
          SubItems.Add(IDEENR);
          SubItems.Add(NAME);
          SubItems.Add(NACHNAME);
          SubItems.Add(KOMPLEX);
          SubItems.Add(GRUPPE);
        end;
// Ende Eintrag in Listview
      end;
// Weiter zum nächsten Knoten
      ANode := ANode.NextSibling;
// Durchlaufen bis NIL
   until ANode = nil;
// Wieder normaler Cursor
   Screen.Cursor:=crDefault;
// Aufruf OnClick, welche die anderen XML-Dateien durchsuchen und mit ComboBox5.Text vergleichen
// und zur Anzeige bringen
       Button1.Click;
       Button2.Click;
       Button3.Click;
  end;
Die OnClicks der Buttons 1 - 3 machen das gleiche wie diese Procedure. Sollte ich es noch "richtig" hinbekommen, poste ich meine Lösung.

Cu Achim
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#5

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 10. Aug 2004, 10:45
Ich muss ganz ehrlich sagen, ich kann den Code nicht kommentieren, weil ich die Frage schon nicht verstanden habe.

Zitat:
Ich habe vier XML-Dateien, die erste habe ich in Comboboxen eingelesen, (kein Problem).
Und was wird in den Comboboxen dargestellt? Diese ID, von der du hier redest:
Zitat:
Jetzt aber möchte ich, das wenn ich einen Eintrag aus einer dieser Comboboxen gewählt habe, das der dazu gehörende Satz oder Sätze (wird über eine "ID" gewährleistet) in einem Listview dargestellt wird.
Und warum brauchst du jetzt auf einmal 3 List-Views?

Und was bedeutet:
Zitat:
Die OnClicks der Buttons 1 - 3 machen das gleiche wie diese Procedure.
Irgendwas müssen die sicher anders machen, sonst gäbe es wohl keinen Grund für 3 Klickprozeduren. Oder anders gesagt: Wenn in diesen Prozeduren der Code identisch ist, dann solltest du über eine Auslagerung in eine separate Prozedur nachdenken, die du dann in den Buttonklicks einfach nur aufrufst. Das verkürzt den Code und reduziert Fehler, weil du bei Problemen nicht mehr 3 Prozeduren anpassen musst.


Das einzige, das mir jetzt einfällt, wäre, dass diese XML-Komponente von Delphi bestimmt auch XPath kann. Hat irgendwer Delphi 6 bzw. 7 zum Bestätigen oder Verneinen dieser Behauptung? Wenn es funktioniert, dann kannst du dir das umständliche Durchlaufen durch das Dokument mit einer Abfrage à la
selectNodes('//V_KOMPLEX[IDEENR="' + ComboBox5.Text + '"]'); sparen. Damit werden allerdings alle V_KOMPLEX-Knoten berücksichtigt; Egal wo in der XML-Datei sie sich befinden. Wenn es in deinem Dokument diese Knoten nur an einer bestimmten Position geben kann, dürfte das kein Problem sein. Andernfalls müsstest du kurz deine Dokumentenstruktur an einem fiktiven Beispiel (bitte nicht mit realen Daten!) zeigen, dann könnte ich (oder wer auch immer) dir eine speziell angepasste XPath-Abfrage zeigen. Wobei es aber auch nicht das Problem ist. Wenn dein Dokument bspw. so aussieht:
XML-Code:
<RootKnoten>
  <Unterknoten>
    <UnterUnterKnoten>Hallo</UnterUnterKnoten>
  </Unterknoten>
  <Unterknoten>
    <UnterUnterKnoten>Welt!</UnterUnterKnoten>
  </Unterknoten>

  
</RootKnoten>
dann sähe die Abfrage für den zweiten UnterUnterKnoten-Knoten so aus:
'/RootKnoten/UnterKnoten[UnterUnterKnoten="Welt!"]'
  Mit Zitat antworten Zitat
joredue

Registriert seit: 10. Jul 2004
10 Beiträge
 
#6

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 10. Aug 2004, 13:00
Hallo Mathias.

Ja ich gebe zu ich muss an meiner Fragestellung arbeiten.

Ich habe die XML-Dateien auf ein Paar Knoten reduziert, da diese sehr viel mehr Knoten beinhalten. Die Struktur ist aber so wie abgebildet.

Zu Deinen Fragen:
Mein Haupt XML-File sieht so aus
XML-Code:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<dsIDEE>
    <V_KOMPLEX>
        <IDEENR>12345678</IDEENR>
        <NAME>Frank</NAME>
        <NACHNAME>Ohnenamen</NACHNAME>
        <KOMPLEX>FSB</KOMPLEX>
        <GRUPPE>Verwaltung</GRUPPE>
    </V_KOMPLEX>
    <V_KOMPLEX>
        <IDEENR>87654321</IDEENR>
        <NAME>Luke</NAME>
        <NACHNAME>Skywalker</NACHNAME>
        <KOMPLEX>FSB2_A1</KOMPLEX>
        <GRUPPE>Entwicklung</GRUPPE>
    </V_KOMPLEX>
</dsIDEE>
Aus dieser Datei werden die ComboBoxen gefüllt. Hier soll eine Vorauswahl Anhand dieser ComboBoxen getroffen werden.
Das Ergebniss gibt in einem TListView dann die gefundenen Treffer wieder. Anhand der jetz ermittelten IDEENR, soll nach Auswahl
der ComboBox die die IDEENR beinhaltet, die drei anderen XML-Dateien nach dieser IDEENR durchsucht werden.

Das Ergebnis dieser Suche wollte ich dann in EINEM ListView haben.

Ich habe jetzt das ganze so umgesetzt, das ich das Darstellen der Daten durch den Aufruf der Buttons erziele. Und ja ich habe
die Procedure im Prinzip drei mal. Aber eben mit Zugriff auf unterschiedliche XML-Files, damit diese in Listviews angezeigt werden.
Ist nicht sehr schön, wenn ich so andere Programme (MPMS2) sehe. Ich bin halt noch neu im Delphi-XML-Geschäft.


Meine drei anderen XML-Files sehen so aus:
XML-Code:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<dsDokumente>
    <V_SCHRIFTSTUECKE>
        <IDEENR>12345678</IDEENR>
        <INHALTLAENGE>32256</INHALTLAENGE>
        <INHALTTYP>doc</INHALTTYP>
        <INHALTNAME>50020101.doc</INHALTNAME>
        <BEMERKUNG>Auflistung aller Bentigten Komponenten f r den Komplex 2</BEMERKUNG>
    </V_SCHRIFTSTUECKE>
    <V_SCHRIFTSTUECKE>
        <IDEENR>12345678</IDEENR>
        <INHALTLAENGE>132256</INHALTLAENGE>
        <INHALTTYP>doc</INHALTTYP>
        <INHALTNAME>500201011.doc</INHALTNAME>
        <BEMERKUNG>Bitte beachten</BEMERKUNG>
    </V_SCHRIFTSTUECKE>
</dsDokumente>
XML-Code:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<dsAbfrage>
    <V_ABFRAGE>
        <IDEENR>12345678</IDEENR>
        <EINHEITEN>36</EINHEITEN>
        <OPTIMIERUNG>0</OPTIMIERUNG>
        <ABSENDEDATUM>0001-01-01T00:00:00.0000000+01:00</ABSENDEDATUM>
        <UMSETZUNG>0</UMSETZUNG>
        <UMSETZUNG_BIS>0001-01-01T00:00:00.0000000+01:00</UMSETZUNG_BIS>
        <KOMMENTAR />
        <RUECKMELDUNG_DATUM>0001-01-01T00:00:00.0000000+01:00</RUECKMELDUNG_DATUM>
    </V_ABFRAGE>
    <V_ABFRAGE>
        <IDEENR>87654321</IDEENR>
        <EINHEITEN>79</EINHEITEN>
        <OPTIMIERUNG>1</OPTIMIERUNG>
        <ABSENDEDATUM>0001-01-01T00:00:00.0000000+01:00</ABSENDEDATUM>
        <UMSETZUNG>1</UMSETZUNG>
        <UMSETZUNG_BIS>0001-01-01T00:00:00.0000000+01:00</UMSETZUNG_BIS>
        <KOMMENTAR />
        <RUECKMELDUNG_DATUM>0001-01-01T00:00:00.0000000+01:00</RUECKMELDUNG_DATUM>
    </V_ABFRAGE>
</dsAbfrage>
XML-Code:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<dsRegister>
    <V_REITER_1_2>
        <IDEENR>12345678</IDEENR>
        <EINHEIT>99</EINHEIT>
        <EINGANGSDATUM>1995-11-15T00:00:00.0000000+01:00</EINGANGSDATUM>
        <ERSTELLUNGSDATUM>1995-11-15T00:00:00.0000000+01:00</ERSTELLUNGSDATUM>
        <NACHNAME>Jones</NACHNAME>
        <NAME>Marc</NAME>
        <ANSPRECHPARTNER />
        <TELEFON />
        <DURCHGEFUEHRT_VON />
        <RUECKSTELLUNG>1</RUECKSTELLUNG>
        <RUECKSTELLDATUM>0001-01-01T00:00:00.0000000+01:00</RUECKSTELLDATUM>
        <ALTERNATIV_NUMMER>0</ALTERNATIV_NUMMER>
        <ENTSCH_BEARBDATUM>0001-01-01T00:00:00.0000000+01:00</ENTSCH_BEARBDATUM>
    </V_REITER_1_2>
    <V_REITER_1_2>
        <IDEENR>87654321</IDEENR>
        <EINHEIT>21</EINHEIT>
        <EINGANGSDATUM>1995-11-15T00:00:00.0000000+01:00</EINGANGSDATUM>
        <ERSTELLUNGSDATUM>1995-11-15T00:00:00.0000000+01:00</ERSTELLUNGSDATUM>
        <NACHNAME>Hardy</NACHNAME>
        <NAME>Olliver</NAME>
        <ANSPRECHPARTNER />
        <TELEFON />
        <DURCHGEFUEHRT_VON />
        <RUECKSTELLUNG>0</RUECKSTELLUNG>
        <RUECKSTELLDATUM>0001-01-01T00:00:00.0000000+01:00</RUECKSTELLDATUM>
        <ALTERNATIV_NUMMER>0</ALTERNATIV_NUMMER>
        <ENTSCH_BEARBDATUM>0001-01-01T00:00:00.0000000+01:00</ENTSCH_BEARBDATUM>
    </V_REITER_1_2>
</dsRegister>
Vielleicht wird es ja jetzt ein bischen klarer was ich wollte.
Danke für den Hinweis mit der Abfrage, werde ich gleich mal probieren.
Schönen Tag noch und

Cu Achim
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#7

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 10. Aug 2004, 22:04
Okay, jetzt ist es auch für mich etwas verständlicher geworden. Prinzipiell kannst du mit XPath arbeiten, das Problem dürfte aber der unterschiedliche Aufbau der drei XML-Dateien sein. Das einzig Identische ist der <IDEENR>-Knoten.
Aus dem Grund ist es ein bisschen aufwändig, wenn du eine Prozedur zum Laden aller Dateien nutzen willst. Insofern ist es ganz gut, dass du das noch mal ausführlicher beschrieben hast.

Ich bin noch etwas irritiert, wie ich mir diese Vorauswahl vorstellen muss:
Zitat:
Mein Haupt XML-File sieht so aus [...] Aus dieser Datei werden die ComboBoxen gefüllt.
Ich persönlich würde diese Daten ebenfalls schon in einer List-View darstellen. Allerdings weiß ich nicht, inwieweit das in deinem Fall möglich ist. Aber eine tabellarische Darstellung (vsReport-Modus) würde evtl. übersichtlicher aussehen als die Anzeige in diversen Comboboxen. Das könnte vllt. irritierend wirken, weil ich ja bspw. die ID von Hans Müller, aber den Vornamen Lutz und den Nachnamen Lustig auswählen kann.

Weißt du wie ich das meine? Du hast 3 Comboboxen mit der ID, dem Vornamen und dem Namen. Und jede Combobox lässt sich ja separat ändern. Wenn nur die ID für die spätere Suche wichtig ist, dann ist es meiner Ansicht nach unnötig, die anderen Daten separat anzugeben. Du könntest also entweder darauf verzichten und nur die ID anzeigen, oder du nimmst für die Grunddaten auch schon eine Übersicht - eben eine List-View.


Den weiteren Programmverlauf müsste man sich dann noch mal durch den Kopf gehen lassen. Du könntest bspw. den Doppelklick nutzen; sprich: jemand doppelklickt einen Eintrag in der List-View, und das Programm wertet die ID aus, öffnet ein separates Fenster und zeigt dort die Infos aus den 3 anderen XML-Dateien an.
Vllt. ist der Weg mit dem PageControl und den 3 einzelnen List-Views gar nicht mal so schlecht. Wie gesagt, die Struktur der XML-Dateien ist ja unterschiedlich. Ob und wie sich die Daten aus den 3 XML-Dateien in einer List-View zusammenfassen lassen, das kannst nur du entscheiden.

Man könnte darüber nachdenken, eine Prozedur zu benutzen, die zum Laden der XML-Dateien verwendet wird. Die jeweilige Datei ließe sich, abhängig vom Aufruf, bspw. als Parameter übergeben. Das Problem werden dann aber die unterschiedlichen Knotennamen werden. Als Idee würde mir im Moment ein dynamisches Record einfallen, in dem du den Namen des Knotens angibst und quasi das Ergebnis zurück bekommst.
Hört sich etwas verworren an, ich weiß.

Ich meine etwas in der Art:
Delphi-Quellcode:
type
  TXmlNodeArray = record
    NodeName,
    NodeValue : string;
  end;
Nimm als Beispiel die XML-Datei mit dem <V_SCHRIFTSTUECKE>-Knoten. Um die Knoten abzufragen, brauchst du eine Variable vom o.g. Typ:
Delphi-Quellcode:
var
  XmlNodes : array of TXmlNodeArray;
begin
  // Länge auf die Anzahl der gesuchten Knoten setzen
  SetLength(XmlNodes,4);

  // Namen füllen
  XmlNodes[0].NodeName := 'INHALTLAENGE';
  XmlNodes[1].NodeName := 'INHALTTYP';
  { usw. }


  // jetzt rufst du die (im Moment noch fiktive)
  // Prozedur zum Laden der XML-Datei auf und
  // übergibst dabei den Dateinamen und das
  // dynamische Array; die ID darf natürlich
  // nicht vergessen werden
  LoadXmlFile('c:\Eigene Dateien\Datei1.xml',
    ComboBox1.Text,
    XmlNodes);
Ich habe in dem Beispiel "NodeValue" aus dem o.g. Typ nicht grundlos leer gelassen. Dieser Teil würde jetzt von der Prozedur gefüllt werden müssen. Weil du der Prozedur über das Array ja die gewünschten Knotennamen mitteilst, kann sie den dazu passenden Wert in die Variable "NodeValue" schreiben, die dann aber als var deklariert sein muss, damit du sie auswerten kannst:
Delphi-Quellcode:
procedure LoadXmlFile(const FileName: string;
  const ID: string; var NodeArray: TXmlNodeArray);
begin
  // Hier würde also die XML-Datei geladen und nach
  // der ID gesucht werden.
  { ... }

  // Angenommen, es wurde etwas gefunden, dann
  // könntest du nun die gewünschten Knoten auslesen
  for i := low(NodeArray) to high(NodeArray) do
  begin
  // und die Variable "NodeValue" aus dem Array
  // füllen
    NodeArray[i].NodeValue :=
      ANode.ChildNodes[NodeArray[i].NodeName].Text;
  end;

  { ... }
end;
Anhand der (hoffentlich) zurückgelieferten Werte könntest du jetzt die jeweilige List-View füllen, bzw. dafür sorgen, dass die gewünschten Informationen an der richtigen Stelle in einer LV landen, wenn du denn nur eine benutzen willst.


So, das ist natürlich nur ein Ansatz. Ich gebe zu, es ist nicht 100% ausgereift, denn ich habe das eigentlich nur fix aus dem Handgelenk geschüttelt . Wenn man das technisch umsetzen will, müsste man das Konzept noch mal detailliert ausarbeiten. Aber zumindest wäre das ein Versuch, den ich wagen würde, um meinen Code klein und effizient zu halten.
  Mit Zitat antworten Zitat
joredue

Registriert seit: 10. Jul 2004
10 Beiträge
 
#8

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 11. Aug 2004, 00:48
Hallo Mathias.

Danke für diese super Erklärung. Die Bücher die ich in der kurzen Zeit in der ich mit XML arbeite gelesen habe, waren nicht so einfach und verständlich erklärt.

Noch einmal zu meinen ComboBoxen. Das Problem ist, das der USer die IDEENR nicht kennt. Er kennt vielleicht einen Namen oder einen Komplex oder.... Mein Gedanke war eben, das wenn er einen Namen oder einen Komplex weis, dann kann ich Ihm darauf hin eben eine IDEENR liefern. Sicher ist diese das eigentliche Kriterium, aber die Suche des Anwenders beginnt bei "Null".

Die Darstellung der Daten in drei Listviews hat sich, nach dem ich das jetzt so sehe, als garnicht mal so schlecht herausgestellt. Die Menge an Daten, würde ein einziges ListView geradezu sprengen. Aber schon jetzt komme ich auch mit den drei einzelnen ListViews an die Darstellungsgrenzen. Mache mich mal auf die Suche, wo ich für die Delphi eigene XML-VCL noch Infos bezüglich Darstellung über TEdit(s) herbekomme.

Cu Achim
  Mit Zitat antworten Zitat
MathiasSimmack
(Gast)

n/a Beiträge
 
#9

Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol

  Alt 11. Aug 2004, 06:47
Zitat von joredue:
Noch einmal zu meinen ComboBoxen. Das Problem ist, das der USer die IDEENR nicht kennt. Er kennt vielleicht einen Namen oder einen Komplex oder.... Mein Gedanke war eben, das wenn er einen Namen oder einen Komplex weis, dann kann ich Ihm darauf hin eben eine IDEENR liefern. Sicher ist diese das eigentliche Kriterium, aber die Suche des Anwenders beginnt bei "Null".
Dann würde ich erst recht eine Darstellung aller Daten (sprich: Name, Vorname, usw.) in einer List-View bevorzugen. Am besten noch alphabetisch sortiert, damit man ähnliche oder gleiche Namen auch sofort sieht. Das müsstest du vllt. mal probieren.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:54 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