Objekte in XML speichern und von Java aufrufen

zoidberger

Mitglied
Eine neue woche, eine neuen Frage :)
Ich mache gerade ein Quiz. Hab eigentlichs chon fast alles fertig jetzt...
also GUI und Methoden, Fragen...
das Problem ist, ich möchte die Fragen in Objekten in einer XML datei Speichern und sie dann von Meiner Java Classe aus aufrufen...
die fragen sollen attribute haben... also leicht mittel und schwer,
4 antworten wobei nur eine richtig ist und eine dieser 4 ist die richtige antwort...
wie kann ich das nun in eine xml datei schreiben und vor allem nachher aufrufen ?
Ich habe jetzt schon einiges über DOM und SAX gelesen... ich denke ich brauche SAX, aber finde einfach keine plausible erklärung oder vlt ein handfestes beispiel..
vlt hat ja jemand von euch ahnung davon ?!
*hoff ;) *
 
okay genauer :)
Ich möchte so ca 60 fragen in mein Programm einbinden... aber nicht in die Java classen reinschreiben, sondern sie praktisch dynamisch aus einer externen (xml) datei rausholen lassen.
Bei diesem besipiel von galileo Computing zB ist es wieder etwas anders...
es gibt dort (nach dem erstellen) eine xml

Code:
<?xml version="1.0" encoding="UTF-8"?> 
<java version="1.6.0" class="java.beans.XMLDecoder"> 
 <string>Today</string> 
 <object class="java.util.Date"> 
  <long>1155907123953</long> 
 </object> 
</java>

mit dem java code

Code:
try 
    { 
      dec = new XMLDecoder( new FileInputStream(filename) ); 
 
      String string = (String) dec.readObject(); 
      Date   date   = (Date)   dec.readObject(); 
 
      System.out.println( string ); 
      System.out.println( date ); 
    } 
    catch ( IOException e ) { 
      e.printStackTrace(); 
    } 
    finally { 
      if ( enc != null ) 
        dec.close(); 
    }

liest man nun den string aus der xml... soweit bin cih schon ;)
das problem ist eigentlich auch, wie soll ich die fragen in die xml schreiben ?
etwa so:

Code:
<?xml version="1.0" ?> 
<quiz> 
    <frage schwierigkeit="leicht" dieFrage="Wie heißt die Antwort auf die Frage nach dem 
      Sinn des Lebens, dem universum und dem ganzen rest ?">
        <antwort1 richtig="false"> Bier </antwort1>
        <antwort2 richtig="true"> 42 </antwort2>
        <antwort3 richtig="false">  Chuck Norris </antwort3>
        <antwort4 richtig="false"> Falsche Antwort </antwort4>  
    </frage> 
    <frage.... 

</quiz>

Und kann ich das dann auch mit diesem

Code:
String frage = (String) dec.readObject();

auslesen udn verwenden ?
 
Das wird so nicht funktioniere, du kannst soweit ich weiß nur komplette Objecte auslesen. Du brauchst doch sowieso die komplette Objecte, als Frage + Antworten, also warum liest du nicht alles aus.
Also grob gesagt, du schreibst dir eine Klasse, die die Frage enthält, alle Antwort-Möglichkeiten und die Schwierigkeitsstufe. Wenn du dann eine Frage brauchst, deserialisierst du dann alles und nutzt dann nur dein Object von deiner Fragen-klasse.

Andere Möglichkeit wäre noch (auch mit der Fragen-Klasse), dass du dir selbst eine XML-Datei entwirfst, wenn möglich mit entsprechendem Schema. Läufst mit dem Sax-Parser drüber und baust dir dann eine Liste von den Object zusammen.

Ich würde dir aber auf jedenfall empfehlen eine Klasse zu schreiben die, alles was du bei deiner Frage brauchst enthält.

MFG

zEriX
 
Da liegt ja mein Problem, dass ich mir nicht vorstellen kann wie ich das in eine xml datei reinschreiben soll !?
(also ich hab nochnicht viel mit xml gemacht... html schon einiges, aber das ist ja nur vom aussehn gleich ;) )
ich les die ganze zeit irgendwelche tollen sachen durch und dauernd kommen neue abkürzungen dazu und jeder empfielt was anmderes und auf einemal soll man was runterladen und "kinderleicht" aber das finde ich leider nicht^^
ich googel mal solange weiter nach marshalling (neues wort gefunden :D )

danke aber schonmal zetrix !
 
Grob gesagt kannst du dir deine XML-Datei schreiben wie du es willst.
Das Beispiel was du geschrieben hast, würde doch schon gehen, warum machst du es denn nicht so?
Ok, ich würde die Frage nicht in ein Attribut schreiben wie du es gemacht hast, sondern eher so.

Code:
<frage>Das ist die Frage</frage>

MFG

zEriX
 
wie würde ich denn dann die antworten dieser frage zuweisen ? dann bräuchte ich doch wieder eine äußre funktion die das zusammenhällt oder ?!
also
Code:
<quiz>
  <dieFrage>Wie heißt....blablub</dieFrage>
  <antworten>
     <antwort1 right="true"> Richtige antwort</antwort1>
     ...
  </antworten>
</quiz>

oder wie meinst du das ?
ich hab überhaupt keine ahnung was ich jetzt damit anfangen soll :D
 
dann bräuchte ich doch wieder eine äußre funktion die das zusammenhällt oder ?!

Was meinst du damit?

Schau dir mal den Dom-Parser und den Sax-Parser an. Nimm dir einfach mal eine XML-Datei und parse die mal mit den Parsern. in einem Beispiel was ich dir gepostet hab, werden die Daten der XML-Datei einfach ausgegeben. Da wirst du sehen wie die XML-Datei geparst wird. Ich denke mal, dass das dir weiterhelfen wird.

MFG

zEriX
 
Ohmann und ich dachte das ist sicher nicht so schwer^^
das eine beispiel mit dem SAXExample... das läuft nicht...
eclipse findet den import oracle.xml.parser.v2.*; nicht...
dann meckerts noch an
Code:
Parser parser = new SAXParser();
wobei Parser einfach durchgestrichen wird und SAXParser unterstrichen...

also ich denke das hängt alles mit dem import zusammen...
ich hab für heute keinen nerv mehr...
werd morgen weitermachen :)
vielen danke für deine gedult heute zetrix

(achja ich meinte vorhin, dass wenn ich eine frage habe und 4 antworten, dann mach ich das mit <frage>....</frage> und den antworten...
was aber wenn ich 60 verscheidene fragen habe mit jeweils 4 antworten (und es müssen "genau die" 4 antworten zu der frage, die da auch hin gehören ^^ also muss die frage + dazugehörige antworten in "ein pack" oder nicht ?!)
 
Ich fand die Anfangsstruktur schon mal gar nicht so schlecht. Letztlich ist es aber eine Geschmacksfrage:
Code:
<?xml version="1.0" ?> 
<quiz> 
    <frage schwierigkeit="leicht" text="Wie heißt die Antwort auf die Frage nach dem 
      Sinn des Lebens, dem universum und dem ganzen rest ?">
        <antwort richtig="false"> Bier </antwort1>
        <antwort richtig="true"> 42 </antwort2>
        <antwort richtig="false">  Chuck Norris </antwort3>
        <antwort richtig="false"> Falsche Antwort </antwort4>  
    </frage> 
    <frage.... 

</quiz>

Ein Ansatz wäre eine Klasse mit einem Constructor der ein JDOM Element übernimmt:
Java:
class Frage {
  List<Antwort> antworten = null;
  String text = null;
  public Frage(Element jdomFrage) {
    text = jdomFrage.getAttribute("text");
    antworten = new List<Antwort>();
    List<Element> jdomAntworten = jdomFrage.getChildren("antwort");
    for(Element jdomAntwort : jdomAntworten) {
      antworten.add(new Antwort(jdomAntwort);
    }
  }

  public ... get ...
}
Und eine Klasse Antwort:
Java:
class Antwort {
  String text = null;
  boolean richtig = false;
  public Antwort(Element jdomAntwort) {
    text = jdomAntwort.getText();
    richtig = jdomAntwort.getAttribute("richtig");
  }
  public get...
}

Erzeugen kannst Du das dann alles in ungefär so:
Java:
SAXBuilder	builder = new SAXBuilder();
Document	jdoc = builder.build(new File("deinXMLFile"));

List<Element> jdomFragen = jdoc.getRootElement().getChildren("frage");
List<Fragen> fragen = new List<Fragen>();
for(Element jdomFrage : jdomFragen ){
  fragen.add(new Frage(jdomFrage);
}

Ich hoffe nicht zu viele Fehler gemacht zu haben, hab das eben so aus dem Kopf hier im Browser ohne Syntax-Check geschrieben.

Zu beachten wäre, das dem Befragten kein Zugriff auf die XML Datei gegeben ist. Sonst wären die Fragen doch recht schnell beantwortet ;)

Gruß
 
Zurück