JAXB - Problem mit Java Listen unmarshalling

will2k

Mitglied
Hallo,


xml Datei:


Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settingsData>
    <Movie Format>AVI</Movie Format>
    <Movie Format>MPG</Movie Format> 
    <Movie Format>MPEG</Movie Format>
</settingsData>



Codeauszug aus der Klasse SettingsData:

Code:
@XmlElement( name = "Movie Format" )
public List<String> elements = new ArrayList<String>();


xml datei wird geladen:

Code:
JAXBContext jc = JAXBContext.newInstance(SettingsData.class);
Unmarshaller um = jc.createUnmarshaller ();
           
Object o = um.unmarshal(new FileInputStream("settings.xml"));
settingsdata = (SettingsData) o;       
          
for(int i = 0 ; i < settingsdata.getElements().size() ; i++)
System.out.println(settingsdata.getElements().get(i));


Die letzten beiden Zeilen sorgen für diesen Fehler:

Code:
javax.xml.bind.UnmarshalException
- with linked exception:
[org.xml.sax.SAXParseException: Attribute name "Format" associated with an element type "Movie" must be followed by the ' = ' character.]


Versteht jemand die Fehlermeldung?
 
Du darfst so keine Leerzeichen in XML-Elementen verwenden. Ich weiß gerade nicht obs überhaupt geht, aber wenn dann nur codiert.

Im Moment hält er Movie für den Namen des Elements und Format für ein Attribut, welchem aber kein Wert zugewiesen ist. Die Fehlermeldung bezieht sich darauf dass er sowas erwartet: <Movie Format=Wert> </Movie>

Was du willst ist aber wohl <MovieFormat></MovieFormat>
 
Du darfst so keine Leerzeichen in XML-Elementen verwenden. Ich weiß gerade nicht obs überhaupt geht, aber wenn dann nur codiert.

Im Moment hält er Movie für den Namen des Elements und Format für ein Attribut, welchem aber kein Wert zugewiesen ist. Die Fehlermeldung bezieht sich darauf dass er sowas erwartet: <Movie Format=Wert> </Movie>

Was du willst ist aber wohl <MovieFormat></MovieFormat>

danke jetzt gehts auch mit ein und auslesen der List elemente. Doch eine wichtige Frage habe ich noch:

das ganze sind ja beliebige elemente einer Liste müsste das ganze dann nicht eher so aussehen:

Code:
<settingsData>
       <list1>
              <MovieFormat>AVI</MovieFormat>
        </list
        <list2>
              <MovieFormat>MPG</MovieFormat>
        </list>
<settingsData>

oder so ähnlich?

Ich habe mir dieses Beispiel angeschaut:

http://www.tutego.com/blog/javainsel/2008/02/mikroformate-mit-jaxb-in-xml-abbilden.html

da werden sogar 2 Klassen benutzt nur um listeneinträge in einer xml zu speichern, OK die einträge sehen eben aufwendiger aus in der xml Datei und sind mehr unterteilt, ums kurz zu machen ich würde einfach gerne wissen ob man beliebige Einträge anders speichert als ich dies machte ganz oben!?

so lese ich die listeinträge aus in der xml_lade methode:

Code:
 for(int i = 0 ; i < settingsdata.getElements().size() ; i++)
	     
	        myJComboBox.addItem(settingsdata.getElements().get(i));
 
Ich würde es so machen:

XML:
<settingsData>
    <movieFormats>
         <MovieFormat>AVI</MovieFormat>
         <MovieFormat>MPG</MovieFormat> 
         <MovieFormat>MPEG</MovieFormat>
    </movieFormats>
</settingsData>

Dann kannst du auch mehr als eine Einstellung in deinen settingsData ablegen und hast eine ordentliche Struktur.
 
Zuletzt bearbeitet von einem Moderator:
Ich würde es so machen:

XML:
<settingsData>
    <movieFormats>
         <MovieFormat>AVI</MovieFormat>
         <MovieFormat>MPG</MovieFormat> 
         <MovieFormat>MPEG</MovieFormat>
    </movieFormats>
</settingsData>

Dann kannst du auch mehr als eine Einstellung in deinen settingsData ablegen und hast eine ordentliche Struktur.

hm... wenn ich also <movieFormats> habe als Überdingens...muss ich dann nicht auch eine eigene Javaclass MovieFormats machen und in dieser ist die Liste drin? Was ich bei deinem guten Beispiel nicht verstehe wie ich die Struktur mit Java hinbekomme :)
 
Zuletzt bearbeitet von einem Moderator:
Probier mal:
Java:
@XmlElementWrapper(name="movieFormats")
@XmlElement( name = "MovieFormat" )
public List<String> elements = new ArrayList<String>();
 
Hallo,

Java:
package de.tutorials.domain;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.XmlValue;

@XmlType(name = "movieFormat")
@XmlAccessorType(XmlAccessType.FIELD)
public class MovieFormat {

	@XmlValue
	private String name;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public String toString() {
		return this.name;
	}
	
}

Java:
/**
 * 
 */
package de.tutorials.domain;

import java.util.ArrayList;
import java.util.List;

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;
import javax.xml.bind.annotation.XmlType;

/**
 * @author Tom
 *
 */
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name="settingsData")
@XmlRootElement(name="settingsData")

public class SettingsData {
	
	@XmlElement(name="movieFormat")
	@XmlElementWrapper(name="movieFormats")
	private List<MovieFormat> movieFormats = new ArrayList<MovieFormat>();

	public List<MovieFormat> getMovieFormats() {
		return movieFormats;
	}

	public void setMovieFormats(List<MovieFormat> movieFormats) {
		this.movieFormats = movieFormats;
	}
}

Java:
/**
 * 
 */
package de.tutorials;

import java.io.File;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Unmarshaller;

import de.tutorials.domain.SettingsData;

/**
 * @author Tom
 *
 */
public class JAXBExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) throws Exception{
		JAXBContext jaxbContext = JAXBContext.newInstance(SettingsData.class);
		Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
		
		SettingsData settingsData = (SettingsData) unmarshaller.unmarshal(new File("data.xml"));
		System.out.println(settingsData.getMovieFormats());
	}
}

XML:
<?xml version="1.0" encoding="UTF-8"?>
<settingsData>
	<movieFormats>
		<movieFormat>AVI</movieFormat>
		<movieFormat>MPG</movieFormat>
		<movieFormat>MPEG</movieFormat>
	</movieFormats>
</settingsData>

Ausgabe:
Code:
[AVI, MPG, MPEG]

ansonsten schau mal hier:
http://www.tutorials.de/forum/java/263489-jaxb-tutorial.html

Gruß Tom
 
Zuletzt bearbeitet von einem Moderator:
danke t super!

nur 1 Problem habe ich dadurch:

bisher sah die .xml so aus:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settingsData>
    <company>Warner Bros.</company>
    <playtime>90</playtime>
</settingsData>

nun sollte sie ja so aussehen:


Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settingsData>
    <company>Warner Bros.</company>
    <playtime>90</playtime>
    <movieFormats>
        <movieFormat>AVI</movieFormat>
        <movieFormat>MPG</movieFormat>
        <movieFormat>MPEG</movieFormat>
    </movieFormats>
</settingsData>

doch die datei sieht so aus:

Code:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<settingsData>
    <company>Warner Bros.</company>
    <playtime>90</playtime>
    <movieFormats/>
</settingsData>

Es scheint so als ob bei Schreiben sich was in die Quere kam?

Wie ist das eigentlich mit beliebigen Strings in einer JComboBox, ich lese die ja aus der .xml Datei in eine Jcombobox ein, doch speichern tue ich sie nicht, was ich ja eigentlich auch nicht muss bzw. würde das Sinn machen, denn der benutzer kann ja per GUI keine filmformate hinzufügen sondern nur per .xml Datei Zeile hinzufügen etc.?
 
Zuletzt bearbeitet:
Wenn du nicht möchtest dass der Nutzer was hinzufügt, ist es dann überhaupt sinnvoll das in der XML abzulegen? Man könnte ja die XML-Datei ändern....

Vielleicht solltest du die Formate auf ein Enum Mappen, dann kannst du dir zumindest darüber sicher sein dass nichts hinzukommt.

Und ich denke deine XML sieht nun so aus, weil du die Formate eben nicht gespeichert hast und die Liste somit irgendwie leer war.
 
Wenn du nicht möchtest dass der Nutzer was hinzufügt, ist es dann überhaupt sinnvoll das in der XML abzulegen? Man könnte ja die XML-Datei ändern....

Vielleicht solltest du die Formate auf ein Enum Mappen, dann kannst du dir zumindest darüber sicher sein dass nichts hinzukommt.

Und ich denke deine XML sieht nun so aus, weil du die Formate eben nicht gespeichert hast und die Liste somit irgendwie leer war.

denke du hast mich falsch verstanden etvtl... der Nutzer darf schon was ändern nur geht das nicht über die GUI da ich dann wieder was coden müsste... (faulheit nennt man das ;-) )

ok dann mach ich halt doch ein paar comboboxen dazu mit +/- button dann kann der user das über die GUI machen... danke euch
 
Zurück