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.