gpt4 book ai didi

java - JAXB 注释 - 如何使 XmlIDRef 元素列表具有 id 值作为属性而不是元素正文?

转载 作者:搜寻专家 更新时间:2023-10-31 19:57:22 25 4
gpt4 key购买 nike

更新 - 查看底部的编辑

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 包装器具有空员工对象。如果“员工”是第一位的,它就有效。

这不是什么大问题,但是 marshal 方法会将“办公室”放在首位,因此尝试解码刚刚编码的内容会失败。

编辑 2 Torious 回答中的评论解决了排序问题。

最佳答案

解决方案是使用 XmlAdapterEmployee 包装在一个新类型的实例中,EmployeeRef 指定如何映射XML ID 引用:

@XmlType
public class Office {

@XmlAttribute
String name;

@XmlElementWrapper
@XmlElement(name="employee")
@XmlJavaTypeAdapter(EmployeeAdapter.class) // (un)wraps Employee
List<Employee> employees;
}

@XmlType
public class EmployeeRef {

@XmlIDREF
@XmlAttribute(name="ref")
Employee employee;

public EmployeeRef() {
}

public EmployeeRef(Employee employee) {
this.employee = employee;
}
}

public class EmployeeAdapter extends XmlAdapter<EmployeeRef, Employee> {

@Override
public EmployeeRef marshal(Employee employee) throws Exception {
return new EmployeeRef(employee);
}

@Override
public Employee unmarshal(EmployeeRef ref) throws Exception {
return ref.employee;
}
}

祝你好运。

关于java - JAXB 注释 - 如何使 XmlIDRef 元素列表具有 id 值作为属性而不是元素正文?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10150263/

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