![]() |
Combobox.SelText soll XML-Daten aus drei XML-Dateien holen ?
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 |
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
Hallo alle zusammen.
Habs selbst hinbekommen. Cu Achim |
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
Schön für dich. Und wie?
|
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
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:
Die OnClicks der Buttons 1 - 3 machen das gleiche wie diese Procedure. Sollte ich es noch "richtig" hinbekommen, poste ich meine Lösung.
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; Cu Achim |
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
Ich muss ganz ehrlich sagen, ich kann den Code nicht kommentieren, weil ich die Frage schon nicht verstanden habe.
Zitat:
Zitat:
Und was bedeutet: Zitat:
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
Delphi-Quellcode:
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:
selectNodes('//V_KOMPLEX[IDEENR="' + ComboBox5.Text + '"]');
XML-Code:
dann sähe die Abfrage für den zweiten UnterUnterKnoten-Knoten so aus:
<RootKnoten>
<Unterknoten> <UnterUnterKnoten>Hallo</UnterUnterKnoten> </Unterknoten> <Unterknoten> <UnterUnterKnoten>Welt!</UnterUnterKnoten> </Unterknoten> </RootKnoten>
Delphi-Quellcode:
'/RootKnoten/UnterKnoten[UnterUnterKnoten="Welt!"]'
|
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
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:
Aus dieser Datei werden die ComboBoxen gefüllt. Hier soll eine Vorauswahl Anhand dieser ComboBoxen getroffen werden.
<?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> 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:
Vielleicht wird es ja jetzt ein bischen klarer was ich wollte.
<?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> Danke für den Hinweis mit der Abfrage, werde ich gleich mal probieren. Schönen Tag noch und Cu Achim |
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
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:
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ß. :stupid: Ich meine etwas in der Art:
Delphi-Quellcode:
Nimm als Beispiel die XML-Datei mit dem <V_SCHRIFTSTUECKE>-Knoten. Um die Knoten abzufragen, brauchst du eine Variable vom o.g. Typ:
type
TXmlNodeArray = record NodeName, NodeValue : string; end;
Delphi-Quellcode:
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:
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);
Delphi-Quellcode:
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. ;)
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; 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. |
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
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. :-D 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 |
Re: Combobox.SelText soll XML-Daten aus drei XML-Dateien hol
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz