2012-04-08 8 views
1

XML-AntwortXML Java unmarshalling Objekte

<?xml version="1.0" encoding="UTF-8" standalone="yes" ?> 
- <Film> 
    <film_id>1</film_id> 
    <title>ACADEMY DINOSAUR</title> 
    <description>xxx</description> 
    <length>86</length> 
    <image_id>1</image_id> 
- <image> 
    <image_id>1</image_id> 
    <name>1.jpg</name> 
    <size>408307</size> 
    <type>.jpg</type> 
    <content>base64 byte</content> 
    </image> 
</Film> 

Ich habe erstellt pojo Klassen für Film und Bild.

Film.java

public class Film { 
    private String film_id; 
    private String title; 
    private String description; 
    private String length; 
    private String image_id; 
    private Image image; 
//setter and getter methods 
} 

Image.java

public class Image { 
    private int image_id; 
    private String name; 
    private int size; 
    private String type; 
    private byte[] content; 
//setter and getter methods 
} 

Bitte helfen Ich bin neu in diesem und ich sollte JAXB verwenden.

LÖSUNG:

I hinzugefügt

@XmlRootElement(name = "film") 
public class Film { 
    private int film_id; 
    private String title; 
    private String description; 
    private int length; 
    private int image_id; 
    private Image image; 
} 

auf dem Getter Verfahren der Bild, ich habe @XMLElement (name = "image") gegeben.

Auf Bildklasse habe ich eine Anmerkung @XmlRootElement (name = "Bild") hinzugefügt, die mir gibt, was ich wollte.

+0

unerwartetes Element (uri: "", local: "Film"). Erwartete Elemente sind (keine) ..... das ist der Fehler, den ich erhalte, wenn ich einen Versuch mache. public void unmarshaling (String-Ausgabe) throws JAXBException { \t \t InputStream ist = new StringBufferInputStream (output); \t \t JAXBKontext jc = JAXBContext.newInstance (Film.class); \t \t Unmarshaller u = jc.createUnmarshaller(); \t \t Film film = (Film) u.unmarshal (is); – Koushik

+1

Warum redest du deine Frage nicht, anstatt hart zu schreiben, um Kommentare zu lesen? –

Antwort

1

Das einzige, was benötigt, um Ihren Anwendungsfall an der Arbeit zu bekommen, ist eine @XmlRootElement Anmerkung auf der Film Klasse hinzuzufügen:

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement(name="Film") 
public class Film { 
    private String film_id; 
    private String title; 
    private String description; 
    private String length; 
    private String image_id; 
    private Image image; 
} 

Der andere Teil Ihrer Lösung

on the getter method of Image, I have added @XMLElement(name="image").

On Image class I have added an annotation @XmlRootElement(name = "image"), which gives me what I wanted.

Keines Diese Schritte sind erforderlich, um Ihren speziellen Anwendungsfall abzubilden.

+0

Ja, es benötigt kein @ XMLElement (name = "image"). Ich habe eine Warnung, auch wenn ich @ XMLElement (Name = "Bild") Tag meiner Klasse einbetten. Dies hat meine Ausgabe nicht beeinflusst. Aber worum geht es bei diesem Fehler? ** WARNUNG: Doppelter Klassendefinitionsfehler ist aufgetreten? Bitte melden Sie dies: serviceone/client/entity/Bild $ JaxbAccessorM_getContent_setContent_ [B java.lang.ClassFormatError: Illegaler Klassenname "serviceone/client/entity/Bild $ JaxbAccessorM_getContent_setContent_ [B" in der Klasse file serviceone/client/entity/Image $ JaxbAccessorM_getContent_setContent_ [B ** – Koushik

+0

@Koushik - Die Ausnahme, die Sie sehen, ist spezifisch für die JAXB-Referenzimplementierung und nicht für JAXB (JSR-222) im Allgemeinen. Ich würde empfehlen, das Problem unter dem folgenden Link zu melden: http://java.net/jira/browse/JAXB/ –

-2

Versuchen Sie Ihre Arrays Umwandlung auf Dublieren Klassen zur Liste (für mich gearbeitet)

Wie ich sehe, byte [] -> Liste < Byte>

+0

Liste ist keine gute Idee. Es würde ein Element pro Byte im resultierenden XML erzeugen.In den meisten Fällen ist dies nicht das, was Sie wollen, und es würde die Größe des XML sprengen. – MKorsch