2016-09-14 55 views
0


我試圖用JAXB編組一些數據。我的問題如下: 我有一個類框架,其中包含一個信號圖。JAXB:在地圖上使用@XmlIDREF

@XmlRootElement(name = "frame") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Frame extends V_Element { 


    @XmlElementWrapper(name = "signals") 
    private Map<Signal, Double> signals; 

} 

到目前爲止,XML輸出爲:

<frame id="ee61b926-a1ca-4462-ac58-77d3ac0cbe5e" name="F1"> 
     <signals> 
      <entry> 
       <key id="7352beaa-1921-4bfe-b1ce-3d8dabe69e8b" name="Signal1"> 
        <properties/> 
        <bitLength>0</bitLength> 
        <frame>3ee61b926-a1ca-4462-ac58-77d3ac0cbe5e</frame> 
       </key> 
       <value>1.0</value> 
      </entry> 
     </signals> 
    </frame> 

而是我想有以下模式:

<frame id="3ee61b926-a1ca-4462-ac58-77d3ac0cbe5e" name="F1"> 

     <signals> 
      <signal pos= "1.0">7352beaa-1921-4bfe-b1ce-3d8dabe69e8b</sgnal> 
     </signals> 
    </frame> 

根據幀標籤我只想有信號ID和pos值作爲屬性。 @XmlIDREF註釋在地圖上不起作用。

信號和幀之間的關係是多對多的關係,所以信號在不同的幀中有不同的位置。 任何線索?

回答

1

爲了得到這樣的輸出你的POJO看起來像

@XmlAccessorType(XmlAccessType.FIELD) 
public class Signal { 

    @XmlAttribute(name = "pos", required=true) 
    private Double pos; 
    @XmlValue 
    private String id; 

    public String getId(){ 
     return id; 
    } 
    public Double getPos(){ 
     return pos; 
    } 
    public void setPos(Double p){ 
     pos = p; 
    } 
    public void setId(String id){ 
     this.id = id; 
    } 
} 


public class SignalWrapper { 

    @XmlElement(name="signal", required=true) 
    private List<Signal> signalList; 

    public List<Signal> getSignalList(){ 
     if(signalList == null) 
      signalList = new ArrayList<>(); 

     return signalList; 
    } 
    //no setter for Signal list is necessary 

} 

@XmlRootElement(name="frame") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Frame { 

    @XmlAttribute(name="id", required=true) 
    private String id; 

    @XmlAttribute(name="name", required=true) 
    private String name; 

    @XmlElement(name="signals", required=true) 
    private SignalWrapper sigWrapper; 

    public String getId(){ 
     return id; 
    } 
    public String getName(){ 
     return name; 
    } 
    public void setName(String name){ 
     this.name = name; 
    } 
    public void setId(String id){ 
     this.id = id; 
    } 

    public SignalWrapper getSigWrapper(){ 
     return sigWrapper; 
    } 
    public void setSignalWrapper(SignalWrapper sw){ 
     sigWrapper = sw; 
    } 


} 

測試代碼可能看起來像

final String ENT_XML = "C:\\test\\Signal.xml"; 

      JAXBContext context = JAXBContext.newInstance(Frame.class); 

       Marshaller m = context.createMarshaller(); 

       Signal s = new Signal(); 
       s.setId("7352beaa-1921-4bfe-b1ce-3d8dabe69e8b"); 
       s.setPos(2.0); 

       SignalWrapper sw = new SignalWrapper(); 

       List<Signal> sl = sw.getSignalList(); 
       sl.add(s); 

       Frame f = new Frame(); 
       f.setSignalWrapper(sw); 
       f.setId("3ee61b926-a1ca-4462-ac58-77d3ac0cbe5e"); 
       f.setName("F1"); 

       m.marshal(f, new File(ENT_XML)); 
+0

THX您的回覆@dsp_user。由於信號和幀之間的關係是多對多的關係,所以我不能在信號POJO中放置pos屬性。一個信號在不同的幀中具有不同的位置。對不起,我不是很清楚。 – ridi

0

我已經成功地得到我想要的模式。我添加了一個類SignalPos

public class SignalPos { 

    @XmlAttribute(name = "id") 
    @XmlIDREF 
    private Signal signal; 
    @XmlAttribute 
    private Double pos; 

    public SignalPos() { 
    } 

    public SignalPos(Signal s, double pos) { 
     this.signal = s; 
     this.pos = pos; 
    } 

    public Signal getSignal() { 
     return signal; 
    } 

    public Double getPos() { 
     return pos; 
    } 

} 

而在框架

public class Frame { 
    @XmlElementWrapper(name = "signals") 
    @XmlElement(name = "signal") 
    private List<SignalPos> signals; 

} 

輸出:

<signals> 
     <signal id="d1c23562-d02c-439a-8e7b-d4222c7750c8" pos="23.0"/> 
     <signal id="932d8850-36e3-467b-8a62-1e0ae6bb271a" pos="2.0"/> 
     <signal id="2e6a99b2-95f8-4a5f-bf44-1ce948839e9d" pos="1.0"/> 
    </signals> 
+0

此輸出與您在原始文章中的內容稍有不同(仍然如果這是您想要的,那麼:) –