更新 - 见底部的编辑
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 值成为员工的属性,而不是元素正文?我知道我可以使用 XML 模式来做到这一点,但如果可能的话,我想坚持使用注释。
谢谢你。
编辑 下面 Torious 的解决方案几乎可以工作,但在某些情况下它并不完全有效。
如果“offices”元素出现在(在 xml 文件中)office 引用的“employee”元素之前,则解组失败。找不到员工引用,并且 EmployeeRef 包装器有一个空的员工对象。如果“员工”是第一位的,它就会起作用。
这不是什么大问题,但是编组方法会将“办公室”放在首位,因此试图解组刚刚编组的内容会失败。
在 Torious 的回答中编辑 2条评论解决了排序问题。