Castor - Un marshalling un semplice gruppo ripetuto
Domanda
Vado lentamente arrabbiato per questo. Sto cercando di sbloccare un documento XML come questo:
<GetDeadlineOffset>
<deadlineCode>DC1</deadlineCode>
<parameters>
<parameter name="P1">Param 1</parameter>
<parameter name="P2">Param 2</parameter>
</parameters>
</GetDeadlineOffset>
Ho un paio di pojos semplici, getdeadlineoffsetrequest e parametro, che sembrano questo:
public class GetDeadlineOffsetRequest {
private String deadlineCode = null;
private List<Parameter> parmList = new ArrayList<Parameter>();
public GetDeadlineOffsetRequest() {
// Do nothing
}
public String getDeadlineCode(){
return this.deadlineCode;
}
public void setDeadlineCode(String deadlineCode){
this.deadlineCode = deadlineCode;
}
public List<Parameter> getParameters() {
return parmList;
}
public void setParameters(List<Parameter> parmList) {
this.parmList = parmList;
}
}
e
public class Parameter {
private String name = null;
private String value = null;
public Parameter() {
// Do Nothing
}
public String getName() {
return name;
}
public String getValue() {
return value;
}
public void setName(String name) {
this.name = name;
}
public void setValue(String value) {
this.value = value;
}
}
Sto usando un file di mappatura ma non riesco a far sì che quei tag non abbiano un marshall nel mio elenco di parametri.
Questo è il mio ultimo tentativo di una mappatura:
<class name="mypkg.GetDeadlineOffsetRequest">
<map-to xml="GetDeadlineOffset"/>
<field name="DeadlineCode" type="java.lang.String">
<bind-xml name="deadlineCode" node="element" />
</field>
<field name="Parameters" type="mypkg.Parameter" collection="collection">
<bind-xml name="parameters" node="element" />
</field>
</class>
<class name="mypkg.Parameter">
<map-to ns-uri="http://services.blah.com/AMM/Deadline/v1"/>
<field name="Value" type="java.lang.String">
<bind-xml name="parameter" node="element" />
</field>
<field name="Name" type="java.lang.String">
<bind-xml name="name" node="attribute" location="parameter" />
</field>
</class>
Il problema sembra ruotare attorno al fatto cheu003Cparameters> è l'elemento contenitore eu003Cparameter> è l'elemento ripetibile. La mappatura sopra sta dicendo a Castor cheu003Cparameters> è ripetibile.
Ho provato tutti i tipi di combinazioni di mapping da un paio di giorni e penso di aver fatto io in un angolo!
Qualcuno può vedere cosa sto facendo di sbagliato?
Sto usando Castor XML 1.3.2.
Soluzione
Sono riuscito ad avere un certo successo con la seguente mappatura:
<class name="myPkg.GetDeadlineOffsetRequest">
<map-to xml="GetDeadlineOffset"/>
<field name="DeadlineCode">
<bind-xml name="deadlineCode" />
</field>
<field name="parameters" type="myPkg.Parameter" collection="collection">
<bind-xml name="parameter" location="parameters">
<class name="myPkg.Parameter">
<field name="Name">
<bind-xml name="name" node="attribute" />
</field>
<field name="Value">
<bind-xml node="text"/>
</field>
</class>
</bind-xml>
</field>
</class>
Il trucco era usare location = "parametri" e node = "testo" su un paio di Bind-xml elementi. Ho marchiato con successo e non mi sono stato sfacciato usando questa mappatura.
Altri suggerimenti
Hai qualche controllo sul formato XML che stai tentando di leggere o deve essere in questo formato?
<GetDeadlineOffset>
<deadlineCode>DC1</deadlineCode>
<parameters>
<parameter name="P1">Param 1</parameter>
<parameter name="P2">Param 2</parameter>
</parameters>
</GetDeadlineOffset>
Sono stato in grado di far scrivere questo formato, ma Castor non lo riassumeva in un'eccezione.
Il più vicino che potrei arrivare dove sarebbe il maresciallo e lo sbarraggio è:
<GetDeadlineOffset>
<deadlineCode>DeadlineCode</deadlineCode>
<parameters>
<parameter name="Name1" value="Value1"/>
<parameter name="Name2" value="Value2"/>
</parameters>
</GetDeadlineOffset>