gpt4 book ai didi

java - JAXB:在 map 上使用 @XmlIDREF

转载 作者:行者123 更新时间:2023-12-01 09:30:17 28 4
gpt4 key购买 nike


我正在尝试使用 JAXB 整理一些数据。我的问题如下:我有一个类 Frame,其中包含信号图。

@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 注释在 map 上不起作用。

Signal 和 Frame 之间的关系是多对多的关系,因此 Signal 在不同的 Frame 中具有不同的位置。有线索吗?

最佳答案

为了获得这种输出,您的 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));

关于java - JAXB:在 map 上使用 @XmlIDREF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39486500/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com