Verarbeitung von Daten aus XML

06/05/2010 - 23:04 von Mike Wesling | Report spam
Hallo,

ich habe mal eine Designtechnische Frage:

Nehmen wir an, ein System benutzt ein etwas größeres XML zur
Verarbeitung mit einer Menge an Knoten (evtl. verschachtelt).

Die Grafische Oberflàche wird z.B. in Form von ListBox-Controls etc.
dazu benutzt, die Daten aus dem XML zu verarbeiten. Anschließend wird
diese Konfiguration wieder irgendwo hin gespeichert.

Wenn man nun ein solches System konstruiert, würde man das vermutlich in
Komponenten zerlegen, so dass es eine Komponente gibt, deren
Zustàndigkeit es ist, die Daten aus dem XML zu lesen. Eine andere
Komponente ist dann z.B. dafür verantwortlich die Konfiguration aus der
GUI mit Hilfe des XMLs zu speichern.

Von der Aufteilung her, hàtte man dann z.B. eine Komponente
XmlConfigurationDataReader und XmlConfigurationDataWriter, sowie die GUI
zur Darstellung und Auswahl für den Writer. Die Daten aus dem XML werden
dann mit Hilfe von XQueries abgefragt, sowohl beim einlesen in die GUI,
als auch beim Schreiben durch den Writer.

Vermutlich ist der Aufbau damit laut OOAD nicht mal so schlecht.

Allerdings hat man das Problem, dass vermutlich sehr oft das XML mit
XPath-Abfragen abgesucht wird. Nehmen wir an ich muss in einer ListBox
Werte zur Auswahl anzeigen, nach der Auswahl durch den User in eine
andere ListBox muss abhàngig von der Auswahl in einem DataGridView
entsprechend was ein/ausgeblendet werden.


Beim Speichern muss dann wieder jede ListBox nach ihren ausgewàhlten
Elementen befragt werden, daraufhin wieder in das XML, weitere Queries
etc. und letztlich das Schreiben auch wieder mit Abfragen.



Lange Rede kurzer Sinn: Wie sollte man das in der Praxis machen?


Um Abhàngigkeiten zwischen Komponenten zu vermeiden sollten diese so
allgemein wie möglich gestaltet werden. Für mich heißt das aber immer es
gibt meinetwegen eine Methode, die z.B. eine Liste von Eintràgen zurück
liefert. Diese Liste wird dann wieder von einer anderen Komponente
weiter verwarbeitet, was dazu führt, dass schon wieder alle Elemente
dieser Auflistung durchlaufen werden müssen etc.
Hier kann es schnell passieren, dass man dadurch "unnötig" Schritte in
Schleifen macht und das ganze dann irgendwie tràge wird. Zudem dann noch
mit diversen XPath-Abfragen im XML.


Frage für mich hier ist auch: sollte man hier nicht lieber anstelle der
ad-hoc Abfragen per XQuery auf dem XML sich einmal beim Starten der
Applikation die Daten so weit möglich wieder in eigene interne
Datenstrukturen einlesen um dann spàter nur noch mit diesen zu arbeiten
(Generics, wie z.B. Dictionary<..,..> oder List<...>)?


Oder sollte man das wirklich grundsàtzlich in dieser unabhàngigen
Komponenten-Form beibehalten und es gibt dann eben Methoden, die eine
Liste von Ergebnis-Eintràgen zurück liefern und dazu jedes Mal das XML
durchforsten und diese werden weiter verarbeitet?.


Alleine zum Füllen einer ListBox mit Werten aus dem XML müsste ich
entweder der Komponente einen Verweis auf die Listbox mitgeben, damit
z.B. der XmlConfigurationDataReader die GUI befüllt (was eigentlich
nicht sein Aufgabe ist, da Reader), oder ich müsste sagen der Reader
liest eben und liefert eine gewisse Collection zurück, danach wird diese
wieder durchlaufen und die ListBox dann gefüllt (zwei Mal durch die
Elemente).

Zusàtzlich ist die Frage, ob es empfehlenswert ist, direkt auf dem XML
immer ad-hoc die Queries zu starten, oder ob man sich doch viel Lieber
1x beim Starten alles auslesen sollte und Hashtables etc. aufbauen
sollte mit Daten, die man spàter irgendwann in einer gewissen Form zur
Weiterverarbeitung benötigen könnte.


Was könnt Ihr hier empfehlen? Ich denke mal, dass solche Art von
Szenarien doch recht hàufig sind und es evtl. von Euch eine Art Design
bzw. Architektur Pattern dafür geben könnte?
 

Lesen sie die antworten

#1 Martin Koch
07/05/2010 - 15:29 | Warnen spam
Hi

Ich bin kein SW-Architekt, aber ich würde das Ganze mit WPF und Binding lösen.
Das geniale binding nimmt dir einigen Balast vom hin- und herschreiben
zwischen GUI und Daten ab.
Zudem würde ich nicht mit XPath schaffen (oder nur begrenzt) sondern mit
LINQ to XML.
Ein Einstieg in WPF und LINQ ist aber nicht zu unterschàtzen.

Grüsse
Martin

Ähnliche fragen