Objekte in XML speichern und von Java aufrufen

Also ich würde das mit JAXB machen:

Java:
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

@XmlType
public class Answer {
	@XmlAttribute(name = "correct", required = true)
	private boolean correct = false;

	@XmlValue
	private String answerString;

	public Answer(boolean correct, String answerString) {
		super();
		this.correct = correct;
		this.answerString = answerString;
	}

	public Answer() {

	}

	@XmlTransient
	public boolean isCorrect() {
		return correct;
	}

	public void setCorrect(boolean correct) {
		this.correct = correct;
	}

	@XmlTransient
	public String getAnswerString() {
		return answerString;
	}

	public void setAnswerString(String answerString) {
		this.answerString = answerString;
	}

}
Java:
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlTransient;
import javax.xml.bind.annotation.XmlType;

@XmlType
public class Question {

	public enum Difficulty {
		EASY
	}

	@XmlAttribute(name = "schwierigkeit", required = true)
	private Difficulty difficulty = Difficulty.EASY;
	@XmlAttribute(name = "text", required = true)
	private String questionString;
	@XmlElement(name = "answers", required = true)
	private List<Answer> answers = new ArrayList<Answer>();

	public Question(Difficulty difficulty, String questionString) {
		this.difficulty = difficulty;
		this.questionString = questionString;
	}

	public Question() {

	}

	public void addAnswer(Answer answer) {
		this.answers.add(answer);
	}

	@XmlTransient
	public String getQuestionString() {
		return questionString;
	}

	public void setQuestionString(String questionString) {
		this.questionString = questionString;
	}

	@XmlTransient
	public List<Answer> getAnswers() {
		return answers;
	}

	public void setAnswers(List<Answer> answers) {
		this.answers = answers;
	}

	@XmlTransient
	public Difficulty getDifficulty() {
		return difficulty;
	}

	public void setDifficulty(Difficulty difficulty) {
		this.difficulty = difficulty;
	}

}
Java:
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement(name = "quiz")
public class Quiz {

	@XmlElement(name = "question", required = true)
	private List<Question> questions = new ArrayList<Question>();

	@XmlTransient
	public List<Question> getQuestions() {
		return questions;
	}

	public void setQuestions(List<Question> questions) {
		this.questions = questions;
	}

	public void addQuestion(Question question) {
		questions.add(question);
	}

	public static void main(String[] args) {

		Quiz quiz = new Quiz();
		Question question = new Question(Question.Difficulty.EASY, "Testfrage");
		question.addAnswer(new Answer(true, "TestAntwort"));
		question.addAnswer(new Answer(false, "TestAntwort2"));
		quiz.addQuestion(question);
		JAXBContext jc;
		try {
			jc = JAXBContext.newInstance(Quiz.class);

			Marshaller m = jc.createMarshaller();
			m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
			m.marshal(quiz, new FileOutputStream("test.xml"));

			Unmarshaller um = jc.createUnmarshaller();

			Quiz quizRead = (Quiz) um.unmarshal(new File("test.xml"));
			System.out.println(quizRead.getQuestions().toString());
		} catch (JAXBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

}

Ergibt dann folgendes XML:
Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<quiz>
    <question text="Testfrage" schwierigkeit="EASY">
        <answers correct="true">TestAntwort</answers>
        <answers correct="false">TestAntwort2</answers>
    </question>
</quiz>
 
Ohje, da ist wohl was an mir vorbeigegangen. Vielen Dank für den Beitrag, ich hab JAXB mal auf meine Liste der interessanten Technologien gesetzt.

Komisch, da bastel ich fast jeden Tag mit XML rum und kenn das nicht. Also sowas ;)

Vielen Dank
Torax
 
ich sag doch dass es jeder anders macht...
zeja, könntest ruhig noch erwähnen dass ioch dafür noch was runterladen muss ;)
jetzt noch rausfinden wo ich diese javax.bind imports hinstecken muss dass es geht und rausfinden was diese @Xml... sacehn bedeuten, dann kanns losgehn :D
bis morgen und vielen danks chonmal !
 
Du musst dafür nichts runterladen wenn du java ab 1.5 hast.

Die @Xml... sind Annotations die es ab Java 1.5 gibt. Sehr schön für solche Zwecke.
 
Shcau dir eine XStream Bibliothek an. Die ist leicht zu benutzen. Du brauchst nurjeweils 2 Zeilen für Speicher und Laden in und von XML Datei.
 
Also ich hab:

Java 2 Runtime environment 1.5.0_10...
trotzdem funktionieren diese binds und @teiler nicht...
also ich werde mich wohl auf XStream einlassen... (ist ja ganz einfach...
steht zumindest auf der site)
ich versteh nichtmal wie man den installiert ^^
warum muss das mit xml so kompliziert sein ?!
vlt denk icha cuh einfach zu kompliziert !?
vlt sollte ich mir nicht 50 verscheidene methoden anschaun und mich wundern, dass
ich nichts versteh...
:D
 
ja da bleibt trotzdem das Problem, dass ich 1. XStream nicht installiert bekomm und 2. diese bindings und imports von der anderen variante (incl. @teiler) nicht funktionieren. Ich such mal im netz nach ner anleitung zur installation von XStream, es sei denn einer von euch weiß das auf die schnelle ?
 
Mit was entwickelst du denn? Mit eclipse? Nur weil 1.5 installiert ist heisst es ja nicht dass du es auch benutzt.

Zu XStream:
XStream Download Dort lädst du die Binary Distribution der Stable Version 1.2.2 runter. Das zip was du bekommst öffnest du und nimmst dir alle jars aus dem Ordner lib. Dieses kopierst du in dein Projekt am besten in einen Ordner namens lib oder wo auch immer du Bibliotheken ablegst.

Dann musst du nur noch diese jars dem Classpath hinzufügen und kannst es dann benutzen. Unter eclipse geht das z.B. mit einem Rechtsklick auf das jar und dann Add to Buildpath.
 
wie kann ich das denn überprüfen dass mein eclipse 1.5 benutzt ?
Ich habe nun die libs eingefügt und siehe da die imports klappen schonmal...
ich denke nun klappen vlt auch die @... teiler

zum Beispeil von Thomas (XStream):

Ich hab das jetzt mal so koppiert wies da stand... leider erkennt eclipse "Order" und "LineItem" nicht... cannot be resolved to a type
liegt das vlt auch an dem 1.5 ?

also für die, die den code nochnicht kennen:

Code:
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.io.xml.DomDriver;
    // @author Thomas.Darimont
public class XMLOutputExample {	
	
  /**
   *  @param args
   */

    public static void main(String[] args) throws Exception {

    	Order order = new Order("Thomas Darimont");
        order.add(new LineItem("Salami Pizza", 3.0, 4.99)).add(
        new LineItem("Calzone", 5.0, 2.99)).add(
        new LineItem("Ginger Ale", 10.0, 1.99));

        XStream xstream = new XStream(new DomDriver());

        xstream.alias("order", Order.class);
        xstream.alias("lineitem", LineItem.class);

        String xml = xstream.toXML(order);
        System.out.println(xml);
   }
}
 
Zurück