Java JTree aus/in XML nodes + ID

strohhaar

Lt. Junior Grade
Registriert
Nov. 2009
Beiträge
407
Hallo Leute, ich bin derzeit etwas überfordert. Ich möchte einen JTree serialisieren und deserialisieren aus einer XML. Jeder Knoten müsste noch eine ID erhalten, da diese noch Wörter zugeordnet bekommen aus einer CSV. Hoffe ihr versteht was ich meine.

Naja ich habe mir DOM angesehen und steige dort kaum durch. Gibt es etwas einfacheres? Oder hat Jemand vllt. ein simples Beispiel, wo ich DOM auch mal verstehe.

Bitte keine Zusatzpakete nur JSDK 1.6! MfG
 
Zuletzt bearbeitet:
Also nen JTree kannst du ja durchlaufen(Traversieren).
Von daher wäre es doch am einfachsten die XML Datei einzulesen und für jeden Knoten in der XML nen Knoten im JTree einzufügen. So in der Art:
<parent-node>
<childnode1>
<childchildnode1>
</childchildnode1>
</childnode1>
<childnode2>
</childnode2>
</parent-node>

D.h. die Starttags inner Liste speichern und dann auch ein Knoten hinzufügen. Die anderen Knoten kommen solange unter den Parentnode bis das EndTag kommt.
Sollte nicht so schwer sein ?

Und dann eben jedem Knoten seine ID verpassen udn wieder komplett rausschreiben.
 
Java bietet doch bereits XML Serialisierung. Spricht etwas gegen die Verwendung von XMLEncoder/Decoder?

Ansonsten: was findest Du an der DOM API kompliziert? Wenn Du bei Deinen Versuchen auf konkrete Probleme trifft, bekommst Du hier sicher Hilfe. Konkretes Bemühen vorzeigen solltest Du halt schon...
 
@soares

XMLEncoder/Decoder hatte ich mir schon angesehen und wieder verworfen, da ich der Meinung war, dass ich folgendes (zitiere mich mal selbst) damit nicht realisieren kann:

"Jeder Knoten müsste noch eine ID erhalten, da diese noch Wörter zugeordnet bekommen aus einer CSV. Hoffe ihr versteht was ich meine."

Liege ich da falsch?

@NuminousDestiny

Danke!
 
Zuletzt bearbeitet:
strohhaar schrieb:
XMLEncoder/Decoder hatte ich mir schon angesehen und wieder verworfen, da ich der Meinung war, dass ich folgendes (zitiere mich mal selbst) damit nicht realisieren kann:

"Jeder Knoten müsste noch eine ID erhalten, da diese noch Wörter zugeordnet bekommen aus einer CSV. Hoffe ihr versteht was ich meine."

Liege ich da falsch?

Kommt darauf an, was die Aufgabenstellung genau fordert. Das wird nicht klar.

XMLEncoder serialisiert den kompletten Baum und natürlich auch die Domain-Objekte. Wenn dort die ID enthalten ist, erscheint sie auch im XML. Wenn man eine eigene ID während der Serialisierung vergeben möchte, ist das aber auch möglich (mittels Custom Persistence Delegate).

Davon abgesehen, kann man das Ergebnis von XMLEncoder natürlich weiterverarbeiten und beliebige Information hinzufügen.

Wenn spezielle Anforderungen hinsichtlich des XML-Formats bestehen, ist XMLEncoder vermutlich nicht das Richtige, aber das geht aus Deinen Ausführungen nicht eindeutig hervor.
 
Die Knoten im JTree bestehen aus Kategorien (während des Programmlaufs kann man auch welche hinzufügen oder entfernen). Diesen Kategorien werden vorhandene Wörter zugeordnet (während des Programmlaufs kann man auch Wörter einer Kategorie zuordnen, also eine neue Beziehung herstellen).

Die gesamten Kategorien dürfen im Speicher gehalten werden, die Wörter nicht, bzw. nur wenn diese benötigt werden. Also dachte ich mir, ich packe die Kategorien in eine XML und die Wörter in eine CSV. Wenn eine Kategorie (Knoten) geöffnet wird, zu der Wörter eine Beziehung haben, dann werden die Wörter aus der CSV geladen. So war mein Ansatz. (ein Wort aus der CSV kann kein Knoten/Kategorie darstellen)

Ich hoffe, ich habe das verständlich beschrieben.

Bsb:

---Medizin
------- Operation
-----------Instrumente
---------------- Skalpell
---Mathematik
......

Schwarz: Kategorie
Grün: Wort


Und ich suche nun nach einer für mich nicht zu schweren Möglichkeit das umzusetzen.

PS: Es muss aber auch kein JTree sein, um das in der GUI darzustellen. Vllt. gibt es da ja auch eine andere und einfachere Lösung.
 
Zuletzt bearbeitet:
Das Domain-Objekt könnte also so aussehen:

Code:
class Category {
   private final Id id;
   private Collection<String> words;
   ...
}

Um bei der Serialisierung "words" auszulassen, kann man dieses Feld als "transient" markieren. Such mal nach "transient property XMLEncoder".
 
Ich habe wieder eine Frage: Ich habe Probleme mit der ID. Wie kann ich einem Knoten eine ID verpassen?? Und wie lese ich diese ID aus? Bei der PersistenceDelegate steige ich nicht durch.
 
Wenn die ID Teil des Domain-Objektes ist, taucht sie auch in der serialisierten Datei auf. Oder wo kommt die ID her? Soll diese erst bei der Serialisierung hinzugefügt werden? Sie muss doch ohnehin Teil des Domain-Objektes sein, wenn später die Wörter nachgeladen werden sollen!? Ich sehe hier das Problem nicht.
 
Aber ich sehe in der XML keine ID. Nur: id="DefaultMutableTreeNode1"
 
Ist das keine ID? :cool_alt:

Welche ID soll denn auftauchen? Und wo ist diese definiert? Sie muss natürlich Teil des Domain-Objekts sein. Und sie hängt dann natürlich auch am Domain-Objekt. Wie gesagt, wenn Du spezielle Anforderungen an die XML-Struktur hast, ist XMLEncoder nicht das Mittel der Wahl.

Mit einem Domain-Objekt, ähnlich dem welches ich oben gepostet habe, sieht es z.B. so aus:

Code:
       <object class="Category"> 
        <void property="id"> 
         <string>1</string> 
        </void> 
        <void property="words"> 
         <string>colors</string> 
        </void> 
       </object>

Die ID könnte man jetzt noch im Mutter-Element duplizieren, um die Abfrage danach zu vereinfachen. Aber so viel einfacher und effizienter wird das nicht, als dass es den Aufwand rechtfertigt. Vermute ich mal. Du suchst Dir halt die Category-Elemente und fragst dann die id-Eigenschaft ab. Easy-peasy.

So wie ich das Problem verstanden habe, lässt es sich sehr wohl mit XMLEncoder lösen und man käme mit relativ wenig eigenem Code aus - was generell Ziel sein sollte. Wenn es doch noch spezielle Anforderungen gibt, muss Du halt das gewünschte XML selbst generieren.
 
Ich brauche halt eine eindeutige ID, die wiederum beim Wort in der CSV abgelegt wird, damit das Wort dann der Kategorie zugedordnet werden kann. So dachte ich mir das halt. Mit id="DefaultMutableTreeNode1" wird das nicht klappen :(
 
Der Ansatz ist ja nicht verkehrt. Wenn die ID Teil des Domain-Objekts ist, wird sie auch entsprechend serialisiert. Ich sehe weiterhin das Problem nicht.
 
Das Problem ist, dass er diese ID nicht beibehält. Wenn man einen Knoten mittendrin löscht, erhalten alle folgenden Knoten eine neue ID. Dann funktioniert die Wortzuordnung nicht mehr.

Zweites Problem: Nur Kategorien mit Kinderknoten bekomme eine ID. Kategorien ohne Kinderknoten kann man keine Wörter zuteilen.

Jetzt habe ich das ungute Gefühl, dass ich mich doch mit DOM herumschlagen muss :(
 
Wir schreiben aneinander vorbei...

Wo kommt denn die ID bei Dir her? Die ID des Domain-Objektes würde doch mitserialisiert und sich mithin nicht ändern!? Du solltest mal etwas Code zeigen, um den Prozess zu illustrieren.

Ich bin davon ausgegangen, dass jede Kategorie eine eindeutige ID hat, die sich nie ändert. Mittels dieser ID läuft die Zuordnung der Wörter. Ob eine Kategorie Unterkategorien hat oder nicht, ist egal. Ob eine Zuordnung zu Wörtern erlaubt oder möglich ist, regelst Du über die GUI.
 
Strohhaar, willst du, dass das Programm beim Lesen der XML den Knoten eigenständig IDs zuweist? (Das würde soares' und meine bisherige Verwirrung erklären)

// edit
Oder noch besser, schreib doch mal bitte, was du erreichen willst, nicht, was du denkst, dass du brauchst, um das Gewünschte zu erreichen ;)
 
Hallo Killkrog! Was is erreichen will, habe ich im sechsten Beitrag versucht zu erklären. Falls da was unverständlich ist, dann frage mich :)
Ich brauche halt für jeden Knoten eine ID, die sich nicht verändert. Nehmen wir an, der JTree ist leer, es gibt also nur einen "Allgemeinen Grundknoten". Fügt man jetzt einen Knoten hinzu, dann brauch dieser natürlich auch gleich eine ID, welche sich auch nicht mehr ändern darf. Wenn ich dann während des Progammlaufs der Kategorie ein Wort zuordne, dann landet das Wort inkl. ID in der CSV. Wenn ich z.B. beim nächsten Programmstart den Knoten öffne, dann werden die zugehörigen Wörter aus der CSV geladen, was wiederum über die ID läuft.

@ soares

Ich selbst habe mich bisher garnicht um die ID gekümmert. Ich habe mir nur die XML angeschaut und beobachtet wie sich sich verändert, nachdem ich Knoten im JTree gelöscht hatte. Ich wollte den Encoder etwas verstehen.

Ursprünglich:

....
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode" id="DefaultMutableTreeNode7">
<void property="userObject">
<string>qqq</string>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode" id="DefaultMutableTreeNode8">
<void property="userObject">
<string>qqqqqqqq</string>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode">
<void property="userObject">
<string>qqqqqqqqqqqqqqqqqq</string>
</void>
....

Und nachdem ich einen Knoten über "qqq" gelöscht hatte...

....
<object class="javax.swing.tree.DefaultMutableTreeNode" id="DefaultMutableTreeNode6">
<void property="userObject">
<string>qqq</string>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode" id="DefaultMutableTreeNode7">
<void property="userObject">
<string>qqqqqqqq</string>
</void>
<void method="add">
<object class="javax.swing.tree.DefaultMutableTreeNode">
<void property="userObject">
<string>qqqqqqqqqqqqqqqqqq</string>
</void>
....
 
Zuletzt bearbeitet:
Das serialisierte Ergebnis meinte ich nicht, sondern Deinen Java-Code!

Und natürlich musst Du Dich um die ID kümmern! Wie gesagt, pack Sie in das Domain-Objekt. Wie Du an meinen Beispielen siehst, ist die ID dann nicht von der Baum-Darstellung abhängig. Du weist einfach jeder Kategorie eine feste, eindeutige ID zu, und musst Dich ansonsten um nichts kümmern.

Mir schwant, Du weißt überhaupt nicht, was mit Domain-Objekt gemeint ist?
 
Zurück
Oben