# XML effizient darstellen und bearbeiten



## NewYork (12. Sep 2005)

Hallo,

ich hab schon ziehmlich viel im Internet gesucht, auch hier im Forum und in anderen Foren, habe aber keine so richtige Antwort auf meine Fragen gefunden.

Meine erste Frage, welchen 'Ansatz' benutzt man, um einen Xml-Editor zu erstellen. Ich meine damit, wie kann man effizient eine XML-Datei laden, sie darstellen im z.B. JTree oder JTable, dann Elemente bearbeiten, hinzufügen etc. und dann wieder speichern. 

Mir fällt momentan nur DOM/JDOM ein (das hab ich auch hier im Forum gelesen), weil man ja irgendwie die Xml-Datei 'im Speicher' braucht um sie zu bearbeiten, also funktioniert ja SAX z.B. nicht, oder? Nur ist das ja sehr ineffizient, weil eben der Baum aufgebaut werden muss etc. Außerdem sollte auch eine Suche möglich sein, dazu braucht man, glaub ich, ja auch dem DOM-Baum um mit XPath z.B. suchen zu können. 

Wenn das Schema der XML-Datei bekannt ist, könnte man auch JAXB nehmen, doch da fällt mir nicht so richtig ein, wie man darin suchen kann.

Die 2. Frage ist, gibt es vielleicht schon irgendwo eine Bibliothek o.ä., die man in einer Anwendung benutzen kann um eben XML-Dateien zu editieren.

Es wäre nett, wenn mir vielleicht jemand helfen könnte.


----------



## byte (12. Sep 2005)

NewYork hat gesagt.:
			
		

> Meine erste Frage, welchen 'Ansatz' benutzt man, um einen Xml-Editor zu erstellen. Ich meine damit, wie kann man effizient eine XML-Datei laden, sie darstellen im z.B. JTree oder JTable, dann Elemente bearbeiten, hinzufügen etc. und dann wieder speichern.



am effizientesten xml dateien verarbeiten kann man natürlich event-basiert über einen sax parser. allerdings ist das für einen xml editor denkbar ungünstig. da wirst du um dom nicht herum kommen. 



> Mir fällt momentan nur DOM/JDOM ein (das hab ich auch hier im Forum gelesen), weil man ja irgendwie die Xml-Datei 'im Speicher' braucht um sie zu bearbeiten, also funktioniert ja SAX z.B. nicht, oder? Nur ist das ja sehr ineffizient, weil eben der Baum aufgebaut werden muss etc. Außerdem sollte auch eine Suche möglich sein, dazu braucht man, glaub ich, ja auch dem DOM-Baum um mit XPath z.B. suchen zu können.



was meinst du mit ineffizient? ich denke mal, du spielst auf die performance an. probiers doch einfach mal aus. ich benutze jdom und kann mich nicht beklagen (lese xml dateien ein, die teilweise knapp 1 MB groß sind). du solltest natürlich aufpassen, dass du bei deinen baumoperationen nicht unnötig oft durch den baum iterierst bei großen datenstrukturen, denn das beeinträchtigt die performance natürlich schon bei großen dateien.



> Wenn das Schema der XML-Datei bekannt ist, könnte man auch JAXB nehmen, doch da fällt mir nicht so richtig ein, wie man darin suchen kann.



warum so kompliziert? die suche nach einem element in jdom ist ein 3-zeiler.



> Die 2. Frage ist, gibt es vielleicht schon irgendwo eine Bibliothek o.ä., die man in einer Anwendung benutzen kann um eben XML-Dateien zu editieren.



http://www.jdom.org/docs/apidocs/index.html


----------



## NewYork (12. Sep 2005)

Danke für die Antwort!

Das Problem ist eigentlich, dass die Dateien schon ziehmlich groß sind mit mehreren MB und ich hab fast immer gelesen, dass dann DOM/JDOM nicht besonders gut funktioniert, da der Baum im Hauptspeicher noch größer ist als die XML-Datei an sich. 

Deshalb hab ich noch einmal gefragt, ob vielleicht jemand mehr weiß, z.B. welche 'Technik' die 'professionellen' XML-Editoren verwenden, oder ob man halt wirklich den DOM Ansatz benutzt.


----------



## NewYork (12. Sep 2005)

Mir ist noch etwas eingefallen.

Ich würde auch gerne mehrere XML-Dateien gleichzeitig öffnen können, das heißt, dass man z.B. per JTabbedPane zwischen verschiedenen Dateien hin- und herschalten können sollte. D.h. wenn dann noch mehr Dateien als JDOM-Bäume im Hauptspeicher liegen, funktioniert das wahrscheinlich irgendwann nichtmehr, aber die Dateien jedesmal neu einzulesen, wenn man auf sie zugreift, ist, glaub ich, auch keine gute Idee.

Deshalb dachte ich eben, dass es noch eine andere Möglichkeit außer DOM/JDOM gibt.


----------



## Bleiglanz (13. Sep 2005)

für einen Editor ist DOM sowieso nicht geeignet

und SAX schon gar nicht

was willst du machen, wenn z.B.

<fooo

getippt wurde und das > nocht nicht getippt wurde?

also als normalen Text darstellen

und nebenläufig ab und an mit SAX eine Treeview aufbauen?


----------



## NewYork (13. Sep 2005)

Deswegen frag ich ja, weil ich nicht wirklich Ahnung davon habe (eher gar keine Ahnung).

Ich will eigentlich auch keinen Editor in dem Sinn, dass man selbst XML schreiben muss/kann. Sondern nur, dass man Elemente einfügen kann (also den 'Tagbezeichner' angibt) oder löscht und den Text eines Elementes ändern kann. Das heißt, dass man die Struktur des XML in dem Sinn gar nicht sieht als Anwender (ich weiß nicht wie ich das genau ausdrücken soll) halt eher wie ein WYSIWYG Editor.


----------



## NewYork (14. Sep 2005)

Hallo ich bin's nochmal.

Ich habe nun versucht eine 14MB große XML-Datei einzulesen einmal mittels DOM und einmal mittels JAXB. Beides hat ungefähr genauso lang gedauert (zu lang, eigentlich) nur der Speicherbedarf bei JAXB war geringer.

Da ich genau das Schema der XML-Dateien kenne, habe ich mir nun gedacht, dass ich vielleicht die XML-Datei mit SAX einlesen und mir selber Objekte anlegen könnte um diese in ArrayLists zu speichern, um dann immer über den Index darauf zuzugreifen. 

Hat jemand schon Erfahrungen darin, ob das schneller und weniger 'speicherlastig' wäre? Die 'Baumtiefe' der XML-Datei ist maximal 4.


----------



## SnooP (14. Sep 2005)

Wenn die Anzahl der unterschiedlichen Elemente begrenzt ist, wäre das ne Alternative - SAX ist schon um einiges flinker beim Einlesen - klar die Baumstruktur wird nicht berücksichtigt und du musst zustandsbasiert das ganze verarbeiten... da kann der Aufbau einer analogen Datenstruktur mit Java-Objekten evtl. sinnig sein - hab da aber jetzt keinen Erfahrungswert nur ne prognostische Meinung meinerseits


----------



## byte (14. Sep 2005)

teste es doch erstmal mit jdom. da kannste einfach mit nem saxbuilder dir die xml datei einlesen und ein jdom document erzeugen lassen. jdom nutzt das collection framework und ist im grunde wohl nichts anderes als das, was du dir jetzt per hand bauen willst.



> While JDOM interoperates well with existing standards such as the Simple API for XML (SAX) and the Document Object Model (DOM), it is not an abstraction layer or enhancement to those APIs. Rather, it seeks to provide a robust, light-weight means of reading and writing XML data without the complex and memory-consumptive options that current API offerings provide.


----------



## NewYork (14. Sep 2005)

Ich hab das jetzt mal mit JDOM ausprobiert und habe festgestellt, dass JDOM meist doppelt so lange braucht um ein Dokument einzulesen und auch fast doppelt soviel 'Speicher' dabei verbraucht. Ob das Zugreifen auf die Elemente dann vielleicht in JDOM schneller ist als in DOM, habe ich nicht ausprobiert.

Danke trotzdem für Deinen Tip!


----------

