2012-10-31 51 views
7

我想要編組我設計的一些類,使用標準JAXB,類都有無效構造函數,這是我第一次嘗試在任何語言中使用JAXB或編組/非標記,但作爲I理解它JAXB應該能夠在沒有XSD的情況下編組它們。使用JAXB編組嵌套類

的類如下:

@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() {   
    } 
} 

我可以馬歇爾Place類,但不是Arc班,Transition我甚至沒有嘗試,該班有@XMLPropriety標籤,但在到達嵌套Place類JAXB似乎也不瞭解要映射它的XML對象。

如果有另一個標籤我應該用於嵌套類或有另一個我忽略的錯誤?

+1

請將您使用的真實代碼放入您的問題中。 JAXB註釋對於理解你的問題非常重要。 – 2012-10-31 13:32:43

+0

我會盡快訪問它。 –

回答

4

沒有什麼特別的,你需要做的任何JAXB (JSR-222)實現處理嵌套類。下面是其中僅使用一個@XmlRootElement註釋一個完整的例子:

過渡

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; 
    } 

} 

package forum13159089; 

class Arc { 

    Place p; 

    public Place getPlace() { 
     return p; 
    } 

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

} 

地點

package forum13159089; 

class Place { 

} 

演示

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中/輸出

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

更多信息


注:@XMLProperty不是JAXB註釋。

+1

謝謝我接受了這個作爲你的博客的答案是啓動JAXB的很大幫助。 –

4

它正在爲我工​​作。請檢查。

@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()); 
     } 

對不起,如果我不明白你的概率。

+0

你的課程與問題中的課程非常不同。例如,您沒有'Arc []'成員。 – 2012-10-31 13:51:38

+0

嗯,我沒有聲明嵌套類是靜態的,我現在無法訪問代碼,我會盡快回復你。 –

+0

檢查我的更新答案。 – KSHiTiJ