XML mit Java auslesen (DB im Hinterkopf)

aja

Mitglied
Hallo,
ich möchte ein .xml-Dokument mittels Java auslesen. Mein ganzes Projekt soll eine Webapplikation sein und die ersten Schritte in Struts sind auch schon gemacht. Nun gehts an die eigentliche Arbeit und bevor ich loslege, möchte ich gerne Eure Meinung wissen
Es wird nämlich eine xml-Datei ausgelesen, in der "Datenbank-ähnliche" Daten stehen, sprich: verschiedene Tabellen mit bestimmten Attributen, die auch teilweise mit Werten vorbelegt sind. Am Ende soll es möglich sein, die Attributwerte zu bearbeiten. Sehe ich das richtig, dass ich dann lieber DOM benutzen soll, damit ich die einzelnen Knotenelemente ansprechen kann? Wie kann ich die ganzen Elemente abspeichern, damit ich auf die Einzelnen zugreifen kann? Muss ich die in den Sessions in meiner Webapp immer weiterschleppen? Wie macht man es "günstig"? (Die Dateien, um die es sich handelt werden ca. 2000er Zeiler sein)
Später soll die Anwendung noch so erweitert werden, dass man auch direkt auf eine DB zugreifen kann, dort die Attributwerte auslesen und bearbeiten können. Es wäre also mehr als wünschenswert wenn die Zwischenschritte für die beiden Fälle anwendbar wären.
Und noch eins: wie realisieren ich in Java eine Navigation? Ich meine, die Datei, die bearbeitet wird, ist an einem festen Ort abgespeichert. Aber wenn man eine Datei aus einer anderen Quelle bearbeiten möchte, müsste man den Pfad irgendwie eingeben können. Wie macht man so ein "Durchsuchen..."?
Wäre für jeden Vorschlag sehr dankbar, da ich ein richtiger Neuling auf dem Gebiet bin...

Schöne Grüße,
aja
 
Hallo,

So einen "Durchsuchen"-Dialog gibt es bei Java schon fertig. Nennt sich JFileChooser.
... dann bau du mal einen JFileChooser in ein WEBANWENDUNG ein...

Bei einer Webanwendung benutzt man i. d. R. den File Selection Dialog des Browsers / Betriebsystems via entsprechendem HTML Formular:

<INPUT TYPE='file' NAME='filename'>
<INPUT TYPE='submit' VALUE='upload'>

Also zum Mappen der XML Daten auf Java Objekte bieten sich verschiedene XML DataBinding Frameworks an:
JAXB
XMLBeans
Castor
JBind
JBiX
...

Gruß Tom
 
Hi Jungs, danke für die Hinweise, aber... ich bin jetzt total durcheinander. Als Allererstes habe ich mich etwas über die DAOs schlau gemacht und so wie ich es verstanden habe, ist es möglich mit deren Hilfe z.B. eine neue Tabelle in einer DB anzulegen. Ich bin aber mehr interessiert in den Schritten, die davor passieren. Erstmal nur mit der .xml-Datei. Ich wüsste nicht so wirklich wie ich da die DAOs einsetzen kann. In dem Beispiel von zerix (in dem verlinkten Thread) sieht das Business-Objekt eigentlich wie eine Bean aus... (Oder lege ich da total daneben?)
Es macht es irgendwie schwieriger für mich, dass meine Objekte aus einer Datei eingelesen und nicht fest vordefiniert werden... Wenn ich zu den nicht ganz verständlichen DAOs noch die zahlreichen von Thomas vorgeschlagenen Frameworks draufpacke, bin ich verloren :rolleyes: Könnte mir einer von Euch vielleicht einen Punkt zeigen, an dem ich "festklammern" kann?

Auch dies mit dem HTML-Formular ist mir leider unklar. Ich setze Struts ein. An welcher Stelle (bzw. in welcher Komponente) kann ich es am besten unterbringen (nicht jsps, oder?)

Danke für jegliche Hilfe,
aja
 
DAOs sind grob gesagt dafür da, dass man den Code wie man was speichert aus dem anderen Code raushält.
Mit dem Interface definierst du welche Methode es gibt, und in der Implementation sagst du dann wie es gespeichert wird. Das kann eine Datenbank sein, das kann eine XML-Datei sein. Das ist vollkommen egal, solange die Methoden den Zweck erfüllen für den sie da sind. So kannst du nachher ohne größere Umstände von einer XML-Datei auf eine Datenbank umsteigen oder kannst auch beides ganz leicht gleichzeitig benutzen.

Das Business-Object ist eine Bean. Ich kenne dein Projekt nicht, aber ich würde dir emfehlen, dass du dir auch eine oder mehrere Beans machst.
Es macht es irgendwie schwieriger für mich, dass meine Objekte aus einer Datei eingelesen und nicht fest vordefiniert werden...
Was meinst du damit? Meinst du mit Datei die XML-Datei? Falls ja, dann kannst du dir doch eine Bean machen. Du ließt die Daten aus der Datei ein und befüllst die Bean und dann gibst du einfach das befüllte Object zurück.

Die Frameworks die Thomas gepostet hat sind Frameworks die eigentlich nichts anderes machen, als aus Daten die in einer XML-Datei stehen Java-Objecte zu machen, bzw Java-Objecte in einer XML-Datei zu speichern.


MFG

zEriX
 
Ja, mit der Datei war meine .xml-Datei gemeint. Ich würde das jetzt so machen, dass ich mir eine Bean erzeuge, in der ich die Elemente einlese (wahrscheinlich mit JDOM) und dann würde ich den Content weitergeben. Bin mir aber nicht sicher, an welcher Stelle ich die DAOs mitspielen lassen sollte... Vielleicht versuche ich zu erklären, wie ich es verstanden habe, damit ihr mich korrigieren könnt...
Also ich würde (eine) Bean haben, in der alle von der xml-Datei ausgelesene Elemente drinne stehen. Es ist sehr praktisch, da in dem direkt drauffolgenden Schritt soll sich der Benutzer aussuchen können, was er als nächstes macht und so müssen die Daten nicht immer mitgeschleppt werden.
Dann würde ich - ähnlich wie in dem Beispiel von zerix ein Interface implementieren, wo die gewünschten Änderungsoperationen vordefiniert werden. Danach eine Klasse, die das Interface implementiert und konkrete Methoden fürs Ändern usw. hat...
Ich werde bestimmt noch massenweise Probleme bei der Struts-Umsetzung haben aber trotzdem vielen Dank für Eure bisherige Hilfe :)

Gruß,
aja
 
Das mit dem DAO ist nicht so schwer. In dem Link den ich gepostet hab, findest du auch ein generisches Interface von Thomas. Das stellt Methoden für die grundlegendsten Funktionen zur Verfügung.
In meinem Beispiel siehst du das Interface(EmpDAO) und eine Klasse dazu(EmpDAOImpl). Die Implementation ist das eigentliche DAO. Da schreibst du wie du das Object abspeicherst, updatest, ausliest, usw. Du könntest mein Beispiel einfach auf XML umstellen, in dem du einfach die EmpDAOImpl-Klasse neu implementierst und darin alles in eine XML-Datei schreibst, bzw aus einer XML-Datei ausliest.
Also der ganze Zugriff auf die Datensätze aus der Datei erfolgt ausschließlich über diese Klasse.

MFG

zEriX
 
Danke, zerix.
Ich dachte, ich mache das so, dass ich in der Bean den Zugriff auf die xml-Datei habe damit ich die allen Parameter setzen kann. Ich würde gerne eine ähnliche Implementierung wie deine machen, aber... Ich müsste am besten auf Tupel arbeiten und sie sind von Tabelle zu Tabelle unterschiedlich. Wie kann ich da einen Typ draus machen? :confused:

Um es genauer zu sagen: es gibt in der Datei table-Tags, die unteschiedliche Namen haben und dann sind noch die Spaltenattribute definiert mit bestimmten Namen und Werten für jedes Tupel, siehe hier:
HTML:
<table name="Location">
    <initial-data>
        <row-content>
              <column-data columnName="Id" value="0"/>
              <column-data columnName="Name" value="Default"/>
              <column-data columnName="UUID"    
                                   value="00000000-0000-0000-0000-000000000000"/>
              <column-data columnName="Description" value="The default location"/>
        </row-content>
        <row-content>
         .......
    </initial-data>
</table>

Es wäre also sinnvoll "row-content" als Typ zu haben, aber der ist bei allen Tabellen unterschiedlich. Wie könnte ich sowas lösen?

Und noch eins: wo bekommt meine Bean die Daten her?

Gruß,
aja
 
Die Daten hängen doch bestimmt irgendwie zusammen. Und so stellst du dir auch die Bean zusammen. Zum Beispiel könntest du - wie du schon meintest - aus einem Row-Content eine Bean machen. Das ist auch richtig so. Die Bean repräsentiert eine Zeile aus der Tabelle.

Wenn Du halt mehrere "Tabellen" hast, musst du halt auch mehrere Beans definieren.

aja hat gesagt.:
Und noch eins: wo bekommt meine Bean die Daten her?
Das musst du halt machen. Entweder mit SAX, DOM oder StaX auslesen, ein neues Object der passenden Bean erstellen. Das Object mit Daten befüllen und zurück geben.

Der andere Weg wäre, wenn du dir eins der Frameworks anschaust die Tom gepostet hat. Da musst du dich nicht mehr drum kümmern wie die Daten in deine Bean kommen.

MFG

zEriX
 

Neue Beiträge

Zurück