更新 - 見編輯在底部JAXB Annotations - 如何使XmlIDRef元素的列表具有id值作爲屬性而不是元素正文文本?
IDREFS/keyrefs似乎JAXB註釋是可能的,但裁判最終被元素的文本。
我想參考是一個元素的屬性。
例如,假設此對象模型:
@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價值是員工的一種屬性,而不是元素正文文本?我知道我可以用XML Schema來做到這一點,但是我想盡可能地堅持註釋。
謝謝。
編輯 Torious下面的解決方案几乎可行,但在某些情況下它不起作用。
如果「辦公室」元素之前(在xml文件中)辦公室引用的「員工」元素出現,解組失敗。未找到員工引用,並且EmployeeRef包裝器具有空員工對象。如果「僱員」是第一個,它就可以工作。
這不會是太大問題,但元帥方法會首先放置「辦公室」,以便試圖解組剛剛編組的問題失敗。
編輯2評論在Torious'答案解決排序問題。
是的,這個伎倆。謝謝。 – marathon 2012-04-15 16:50:31
好的,這在某些(大多數)情況下不起作用。請參閱上面的編輯 – marathon 2012-05-14 00:47:14
用@XmlType(propOrder = {「employees」,「offices」})註釋'Company'類以在編組時強制所需的順序。 – Torious 2012-05-14 02:03:08