Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Java
You last visited: Today at 06:16

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[Java] mit JAXB XML Datei einlesen

Discussion on [Java] mit JAXB XML Datei einlesen within the Java forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Apr 2008
Posts: 15
Received Thanks: 1
[Java] mit JAXB XML Datei einlesen

Ich hoffe einfach, das sich hier jemand mit mit JAXB auskennt und natürlich auch mit XML, da ich in keinem Programmierforum angemeldet bin und mich auch nicht extra anmelden will aber ich komme grade nicht weiter mit meinen Problemen, naja.

Ich versuche grade ein komplett Objektorientiertes Konsolenspiel in Java zu programmieren. Dabei soll man aber auch Maps (Karten) mit einer XML Datei erstellen können und das versuche ich grade mit JAXB umzusetzen. Das Spiel soll dabei so die typischen Adventure Elemente haben. Einzelne Räume, Gegenstände, Monster etc.

Wobei ich jetzt die Probleme habe ist ja das Einlesen der Daten. Das speichern brauche ich ja eigentlich gar nicht, da es mir um das Laden der Karte geht. Irgendwie verstehe ich nicht ganz, wie das dann mit JAXB konkret funktionieren soll. Bisher habe ich ja die einzelnen räume etc. händisch im Programm erstellt und das war aber auch auf Dauer ein wenig unübersichtlich.

Ich bin mir auch ehrlich gesagt schon nicht einmal beim Aufbau der XML Datei sicher, ob bspw. ein Gegenstand einzeln so da sein oder ob der ein Unterpunkt des Raumes sein soll, also so:
Code:
<?xml version="1.0"?>
<map>
	<raum>
		<beschreibung>Raum 1</beschreibung>
		<ausgaenge>
			<ausgang>
				<richtung>links</richtung>
				<nachbar>raum2</nachbar>
			</ausgang>
			<ausgang>
				<richtung>rechts</richtung>
				<nachbar>raum3</nachbar>
			</ausgang>
		</ausgaenge>
		<gegenstaende>
			<gegenstand>
				<name>Schwert</name>
				<beschreibung>Ein altes Eisenschwert. Schaden: 10</beschreibung>
				<schaden>10</schaden>
			</gegenstand>
			<gegenstand>
				<name>Wasser</name>
				<beschreibung>Eine volle Wasserflasche. Stillt den Durst.</beschreibung>
			</gegenstand>
		</gegenstaende>
	</raum>
	<raum>
		<beschreibung>Raum 2</beschreibung>
		<ausgaenge>
			<ausgang>
				<richtung>links</richtung>
				<nachbar>raum4</nachbar>
			</ausgang>
		</ausgaenge>
	</raum>
</map>
oder so aufbauen sollte. Geht das überhaupt mit JAXB in beiden Varianten?
Code:
<?xml version="1.0"?>
<map>
	<raum>
		<beschreibung>Raum 1</beschreibung>
		<ausgaenge>
			<ausgang>
				<richtung>links</richtung>
				<nachbar>raum2</nachbar>
			</ausgang>
			<ausgang>
				<richtung>rechts</richtung>
				<nachbar>raum3</nachbar>
			</ausgang>
		</ausgaenge>
	</raum>
	<raum>
		<beschreibung>Raum 2</beschreibung>
		<ausgaenge>
			<ausgang>
				<richtung>links</richtung>
				<nachbar>raum4</nachbar>
			</ausgang>
		</ausgaenge>
	</raum>
	<gegenstaende>
		<gegenstand>
			<name>Schwert</name>
			<beschreibung>Ein altes Eisenschwert. Schaden: 10</beschreibung>
			<schaden>10</schaden>
			<raum>Raum 1</raum>
		</gegenstand>
		<gegenstand>
			<name>Wasser</name>
			<beschreibung>Eine volle Wasserflasche. Stillt den Durst.</beschreibung>
			<raum>Raum 1</raum>
		</gegenstand>
	</gegenstaende>
</map>
Naja, nun einmal mein Vorgehen soweit:
Beim Start rufe ich die MapLoader Klasse auf:
Code:
import java.io.*;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "map")@XmlAccessorType(XmlAccessType.NONE)
public class MapLoader
{
    public MapLoader()
    {
        
    }

    public static MapLoader load(InputStream input) throws JAXBException 
    {
        return (MapLoader) JAXBContext.newInstance(MapLoader.class).createUnmarshaller().unmarshal(input);
    }
}
Hier mal der Code eines Raumes:
Code:
import java.util.Random;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "raum")@XmlAccessorType(XmlAccessType.NONE)
public class Raum 
{    
    private String beschreibung;
    
    private Monster monster; 
    private Inventar inventar;
    @XmlElementWrapper(name = "ausgaenge")@XmlElement(name = "ausgang")  
    private Ausgang[] ausgaenge;
    
    private static final int anzRichtungen = Richtung.values().length;
    
    public Raum() 
    {

    }
    
    public Raum(String beschreibung) 
    {
        this.beschreibung = beschreibung;
        
        ausgaenge = new Raum[anzRichtungen];
        inventar = new Inventar();
    }

    public String getBeschreibung()
    {
        return beschreibung;
    }
    
    @XmlElement(name = "beschreibung")
    public void setBeschreibung(String beschreibung)
    {
        this.beschreibung = beschreibung;
    }
    
    public void setAusgang(Richtung richtung, Raum nachbar) 
    {
        ausgaenge[richtung.ordinal()] = new Ausgang(richtung, nachbar);
    }    
    
    public Raum getAusgang(Richtung richtung) 
    {
        return ausgaenge[richtung.ordinal()];
    }    
    
    public void addGegenstand(Gegenstand gegenstand) 
    {
        gegenstaende.put(gegenstand.getName(), gegenstand);
    }
    
    public Gegenstand getGegenstand(String name)
    {
        return (Gegenstand) gegenstaende.get(name);
    }    
    
    public Gegenstand removeGegenstand(String name)
    {
        return (Gegenstand) gegenstaende.remove(name);
    }
    
    public Monster getMonster()
    {
        return monster;
    }

    public void setMonster(Monster monster)
    {
        this.monster = monster;
    }
}
Wie man aber dann ja oben sieht, gebe ich ja bei Nachbar den Raum an, der dann ebend in der Richtung liegt aber würde das so überhaupt funktionieren? Normal bräuchte ich doch dann eine Referenz, die noch gar nicht existiert oder liege ich da falsch? Würde das so funktionieren?

Wäre das dann so oben auch mit der Ausgangs / Nachbarraumliste richtig? Da muss man dann ja sowohl das Root Element angeben als auch das XML Element oder?

So sieht bei mir der Ausgang aus:
Code:
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "ausgang")@XmlAccessorType(XmlAccessType.NONE)
public class Ausgang
{
    private Richtung richtung;
    private Raum nachbar;
    
    public Ausgang()
    {      

    }
    
    public Ausgang(Richtung richtung, Raum nachbar)
    {
        this.richtung = richtung;
        this.nachbar = nachbar;
    }
    
    public Raum getNachbar()
    {
    	return this.nachbar;
    }
    
    @XmlElement(name = "richtung")
    public void setRichtung(Richtung richtung)
    {
        this.richtung = richtung;
    }
    
    @XmlElement(name = "nachbar")
    public void setNachbar(Raum nachbar)
    {
        this.nachbar = nachbar;
    }    
}
Würden denn dann auch die Verschachtelten Unterelemente, sprich die Ausgänge / Nachbarräume und die Gegenstaende so erstellt werden?

Eine Sache wäre da auch noch aber wenn das so alles funktionieren würde, dann wüsste ich warscheinlich wie das funktioniert. Ich würde gerne einige spezielle Elemente wie den Eingang und den Ausgang in einer Variable in einer Klasse speichern. Müsste man denn dafür bspw. für den ausgang noch um den Raum1 oben im XML noch ein XML Attribut legen, also so:
Code:
<?xml version="1.0"?>
<map>
	<raum>
		<exit>
			<beschreibung>Raum 1</beschreibung>
			<ausgaenge>
				<ausgang>
					<richtung>links</richtung>
					<nachbar>raum2</nachbar>
				</ausgang>
				<ausgang>
					<richtung>rechts</richtung>
					<nachbar>raum3</nachbar>
				</ausgang>
			</ausgaenge>
			<gegenstaende>
				<gegenstand>
					<name>Schwert</name>
					<beschreibung>Ein altes Eisenschwert. Schaden: 10</beschreibung>
					<schaden>10</schaden>
				</gegenstand>
				<gegenstand>
					<name>Wasser</name>
					<beschreibung>Eine volle Wasserflasche. Stillt den Durst.</beschreibung>
				</gegenstand>
			</gegenstaende>
		</exit>
	</raum>
</map>
oder müsste das außerhalb des raumes sein, also vor <raum> und dann den ganzen Raum einschließend oder spielt das keine Rolle?
GeKiller is offline  
Old 10/04/2015, 13:01   #2
 
elite*gold: 0
Join Date: Apr 2010
Posts: 16
Received Thanks: 0
Falls du noch Hilfe brauchst:

Alles was XML-konform ist, ist mit JAXB möglich zu marshallen/unmarshallen. Du solltest dir erstmal ganz genau über deine Struktur klar werden. Wie genau soll "Raum" aufgebaut sein. Was für Informationen, willst du über den Raum speichern?

Erstell dir, wenn du über den Aufbau des Raums einig bist, eine XML-Schema-Datei die alle möglichen Szenarien halten kann. Diese kannst du dann per XJC (ist in der jdk/bin) in eine Klassenbibliothek umwandeln. Damit kannst du dann arbeiten und easy per JAXB marshallen und unmarshallen.

so würde ich jedenfalls vorgehen.

Hilfestellung:
chrysin is offline  
Reply


Similar Threads Similar Threads
[C#] Variable aus Datei in Klasse einlesen
02/28/2014 - .NET Languages - 13 Replies
Hallo, vorgegeben habe ich folgenden Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;
cmd text datei in java datei umwandeln
02/07/2013 - C/C++ - 2 Replies
hey leute weis jemand wie man eine text datei (editor datei) in eine java datei umwandel ich weiß das man das mit cmd machen kann (javav beehl aber wie kann ich auch die laufwerke zugreifen ? sry für die schlechte rechtschreibung LG
[C++]Datei nach dem einlesen bearbeiten
09/19/2010 - C/C++ - 4 Replies
Die Datei einlesen läuft perfekt. Mein Code sieht derzeit so aus: http://paste-code.com/paste.php?id=7TYCbczaKE Nur hab ich keine Ahnung wie ich die Datei an meiner gewünschten Stelle ändern soll. Ich muss einfach nur eine 1 in 1,2 ändern :<



All times are GMT +1. The time now is 06:16.


Powered by vBulletin®
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2026 elitepvpers All Rights Reserved.