2012-10-31 9 views
7

Próbuję marszałek niektórych klas, które zaprojektowałem, ze standardowym JAXB, wszystkie klasy mają pustych konstruktorów, jest to moja pierwsza próba użycia JAXB lub rozkazy/unmarhslling w jakimkolwiek języku dla tej sprawy, ale jak ja Rozumiem, że JAXB powinien być w stanie je obsłużyć bez XSD.Marshalling zagnieżdżone klasy z JAXB

klas są następujące:

@XmlRootElement(name="place") 
class Place { 
    @XmlAttribute 
    //various fields and get set methods 
    public Place() {   
    } 
} 

@XmlRootElement(name="Arc") 
class Arc { 
    // various fields and get set methods 
    @XmlAttribute 
    Place p; 
    public setPlace(Place p) { 
     // ... 
    } 

    public Arc() { 
    } 
} 

@XmlRootElement(name="Transition") 
class Transition { 
    Arc[] a; 

    public Transition() {   
    } 
} 

mogę Marshall klasę Place ale nie klasę Arc The Transition nawet nie próbować, zajęcia mają @XMLPropriety tagów ale gdy osiągnie zagnieżdżona Place klasa JAXB wydaje się nie rozumieć, który obiekt XML również to zmapuje.

Jeśli istnieje inny znacznik, którego powinienem używać dla klasy zagnieżdżonej, czy jest inny błąd, który przeoczyłem?

+1

Proszę podać prawdziwy kod, którego używasz w pytaniu. Adnotacje JAXB są * bardzo * istotne dla zrozumienia twojego pytania. –

+0

Będę, gdy tylko będę mógł uzyskać do niego dostęp. –

Odpowiedz

4

Nie ma nic szczególnego, co musisz zrobić, aby obsłużyć klasy zagnieżdżone z każdą implementacją JAXB (JSR-222). Poniżej znajduje się pełna przykładów, gdzie używany jest tylko jeden @XmlRootElement adnotacja:

Transition

package forum13159089; 

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
class Transition { 

    Arc[] a; 

    public Arc[] getA() { 
     return a; 
    } 

    public void setA(Arc[] a) { 
     this.a = a; 
    } 

} 

Arc

package forum13159089; 

class Arc { 

    Place p; 

    public Place getPlace() { 
     return p; 
    } 

    public void setPlace(Place p) { 
     this.p = p; 
    } 

} 

Place

package forum13159089; 

class Place { 

} 

Demo

package forum13159089; 

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Transition.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum13159089/input.xml"); 
     Transition transition = (Transition) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(transition, System.out); 
    } 

} 

input.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<transition> 
    <a> 
     <place/> 
    </a> 
    <a> 
     <place/> 
    </a> 
</transition> 

Aby uzyskać więcej informacji


Uwaga:@XMLProperty nie jest adnotacji JAXB.

+1

Dziękuję, że zaakceptowałem to jako odpowiedź jako twój blog jest świetną pomocą przy rozpoczynaniu JAXB. –

4

to działa dla mnie. proszę sprawdzić.

@XmlRootElement 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class First { 

     @XmlElement 
     private String name; 
     @XmlElement 
     private String surname; 
     @XmlElement 
     private String address; 
      getters and setters 
    } 


    @XmlRootElement 
    @XmlAccessorType(XmlAccessType.FIELD) 
    public class Second { 

     @XmlElement 
     private String address1; 
     @XmlElement 
     private String address2; 
     @XmlElement 
     private String address3; 
     @XmlElement 
     private First first; 
      getters and setters 
    } 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Forth { 

    @XmlElement 
    private String address6; 
    @XmlElement 
    private String address7; 
    @XmlElement 
    private Second[] array = new Second[2]; 
     getters and setters 
} 

    public static void main(String arsg[]) throws Exception 
     { 
      First first = new First(); 
     first.setName("Kshitij"); 
     first.setSurname("Solanki"); 
     first.setAddress("Nadiad"); 

     Second second = new Second(); 
     second.setAddress1("Kshiutij_1"); 
     second.setAddress2("Kshiutij_2"); 
     second.setAddress3("Kshiutij_3"); 
     second.setFirst(first); 

     Second second1 = new Second(); 
     second1.setAddress1("Kshiutij_1"); 
     second1.setAddress2("Kshiutij_2"); 
     second1.setAddress3("Kshiutij_3"); 
     second1.setFirst(first); 

     Second[] arra = {second, second1}; 

     Forth forth = new Forth(); 
     forth.setAddress6("kjhgaksjfsadf"); 
     forth.setAddress7("sdlkfsdf"); 
     forth.setArray(arra); 

     JAXBContext context = JAXBContext.newInstance(Forth.class); 
     Marshaller marshaller = context.createMarshaller(); 
     StringWriter stringWriter = new StringWriter(); 
     marshaller.marshal(forth, stringWriter); 
     System.out.println(stringWriter.toString()); 
     } 

Przepraszam, jeśli nie rozumiem Twojego problemu.

+0

Twoje zajęcia są * bardzo * różne od klas w pytaniu. Nie masz na przykład członu "Arc []". –

+0

Cóż, nie zadeklarowałem zagnieżdżonej klasy jako statycznej w pierwszej kolejności Nie mogę uzyskać dostępu do kodu w tej chwili, skontaktuję się z Tobą tak szybko, jak to możliwe. –

+0

sprawdź moją zaktualizowaną odpowiedź. – KSHiTiJ

Powiązane problemy