更新-下部の編集を参照してください
IDRefs / keyrefsはJAXBアノテーションで可能であるように見えますが、refは最終的に要素テキストになります。
refを要素の属性にしたいと思います。
たとえば、次のオブジェクトモデルがあるとします。
@XmlType
public class Employee {
@XmlID
@XmlAttribute
String name;
@XmlAttribute
int years;
@XmlAttribute
String foo;
}
@XmlType
public class Office {
@XmlAttribute
String name;
@XmlElementWrapper
@XmlElement(name = "employee")
List<Employee> employees;
}
@XmlRootElement
public class Company {
@XmlElementWrapper
@XmlElement(name = "office")
List<Office> offices;
@XmlElementWrapper
@XmlElement(name = "employee")
List<Employee> employees;
}
外部化されたxml形式を次のように表示したいと思います。
<company>
<offices>
<office name="nyc">
<employees>
<!--*** id ref to employee name ***-->
<employee ref="alice"/>
<employee ref="bob"/>
</employees>
</office>
<office name="sf">
<employees>
<employee ref="connie"/>
<employee ref="daphne"/>
</employees>
</office>
</offices>
<employees>
<!-- *** name is the id *** -->
<employee name="alice" years="3" foo="bar"/>
<employee name="bob" years="3" foo="bar"/>
<employee name="connie" years="3" foo="bar"/>
<employee name="daphne" years="3" foo="bar"/>
</employees>
</company>
代わりに、私ができる最善のことはこれです(Javaコードで上記の注釈を使用して):
<company>
<offices>
<office name="nyc">
<employees>
<employee>alice</employee>
<employee>bob</employee>
</employees>
</office>
<office name="sf">
<employees>
<employee>connie</employee>
<employee>daphne</employee>
</employees>
</office>
</offices>
<employees>
<employee name="alice" years="3" foo="bar"/>
<employee name="bob" years="3" foo="bar"/>
<employee name="connie" years="3" foo="bar"/>
<employee name="daphne" years="3" foo="bar"/>
</employees>
</company>
idref値を要素の本文ではなくemployeeの属性にする方法はありますか?XMLスキーマを使用してこれを実行できることはわかっていますが、可能な限り注釈を使用したいと思います。
ありがとうございました。
以下のTorious によるソリューションはほとんど機能しますが、状況によっては完全には機能しません。
「offices」要素が(xmlファイルで)officeが参照する「employee」要素の前にある場合、アンマーシャリングは失敗します。従業員参照が見つからず、EmployeeRefラッパーにnullの従業員オブジェクトがあります。「従業員」が最初の場合、それは機能します。
これはそれほど問題にはなりませんが、マーシャル方式では「オフィス」が最優先されるため、マーシャリングされたばかりのものをアンマーシャリングしようとすると失敗します。
Toriousの回答の2つのコメントを編集すると、順序の問題が解決します。