XML mit CheckboxTree abgleichen und verändern

Hallo zusammen,

ich steh gerade bisschen auf’m Schlauch, vielleicht kann mich jemand in die richtige Richtung schubsen.

Ich habe eine XML-Datei die ich einlese. Anhand der enthaltenen Elemente erstelle ich mir eine Liste die auf der GUI als CheckboxTree dargestellt wird. Nach dem der User diverse Elemente angeklickt hat, muss ich nun das XML bearbeiten und alle Elemente rauswerfen, die nicht gewählt wurden.

Nach dem der User seine Wahl getroffen hat, habe ich das ursprüngliche XML als org.w3c.dom.Document und eine Liste von Objekten die bei isChecked() true oder false liefern.
Meine Idee ist jetzt, jedes Listen-Element mit jedem XML-Knoten zu vergleichen und wenn nötig den Knoten zu entfernen. Das erscheint mir aber etwas umständlich und auch von der Laufzeit etwas ungünstig zusein.

Das XML einfach neu zuschreiben anhand der gewählten Elemente geht nicht, da die XML-Datei mehr Informationen enthält als für die GUI benötigt und geparst werden.Diese Informationen werden aber später gebraucht.

Hat vielleicht jemand einen anderen Ansatz?

Du könntest die in der Gui hinterlegten Objekte ja um die weiteren Informationen, die man später braucht, aufbohren.

Andererseits stellt sich mir die Frage, wie “Nach dem der User diverse Elemente angeklickt hat” und Sorgen wegen der Laufzeit zusammenpassen.

Warum denn die Knoten entfernen? Auskommentieren tut es doch auch und so bleiben alle Informationen im XML-File auch erhalten.

Der freie XML-Editor in Eclipse EE bietet ebenfalls solche Möglichkeiten, wir du sie grade programmierst. Evtl. findet sich ja irgendwo Quelltext davon, den man studieren kann.

Wenn der User auf „OK“ klickt wird anhand seiner Auswahl das reduzierte XML gespeichert. Das sollte eben nicht ewig dauern.

Soweit ich weiß, wird diese Datei dann in andere Programme eingelesen und ich weiß nicht ob die dort enthaltenen Informationen nicht nur für bestimmte Nutzerkreise sichtbar sein dürfen. Auskommentieren ist also nicht möglich und würde ja den Aufwand den passenden Knoten zu finden nicht reduzieren.

Nach den Quellen vom XML-Editor such ich mal, vielleicht liegen die ja öffentlich einsehbar rum.

Mehr Infos darüber, was das genau für “Dinger” sind, die da isChecked==true liefern, wäre vielleicht hilfreich. Natürlich wäre eine Schleife

for (each thing) {
    for (each node) {
       if (node.belongsTo(thing)) remove(node);
    }
}

ziemlich sicher ungünstig. Aber sowas wie

for (each node) {
   if (lookingUpTheNodeInSomeMapTellsYouThatYouHaveTo) remove(node);
}

wäre doch OK.

Wenn die Checkboxen in der gleichen Reihenfolge sind, wie die Elemente in der XML-Datei, ist der Aufwand linear. Du musst dazu nur die Checkboxliste und den DOM-Tree parallel durchlaufen. Dabei würdest du kein Element mehr als 1x anfassen.

Das mit der Reihenfolge sollte ja passen, wenn ich mit einer LinkedList arbeite.

Ich schau morgen mal genauer rein, bin heute zu nichts gekommen.

So, hatte jetzt etwas Zeit den Vorschlag von cmrudolph auszuprobieren, leider klappt das Ganze nur solange, bis ich den ersten XML-Knoten entfernt habe. Das Problem ist, dass die NodeList sich mit ändert, wenn sich was im DOM ändert. Zumindest versteh ich die API so.

Ich muss mir also die zu entfernenden Knoten extra merken und im Anschluss alle entfernen. Ist zwar nicht schön, aber erfüllt erstmal seinen Zweck.

Wenn ich später noch bisschen Zeitpuffer übrig habe, schaue ich mal ob ich da nicht mit XPath, den speziellen Knoten zur Liste suchend, schneller bin.

Aber danke erstmal :slight_smile:

für eine der beiden Seiten brauchst du eine Map, sonst bleibt dir ja nie was anderes übrig als einen vollen “join” zu machen.

ansonsten würde ich eher das xml manipulieren und jedes Element ggf. mit einem Attribut verzieren

element#setAttrubute(“intern_geheim_checkbox”,“true”)

kannst du ja dann am Ende mit einem einfachen Treewalk wieder rausschmeissen, und dabei alle die immer noch “true” sind dann vollständig entfernen