您可以使用 JAXB 完成这项工作,但您必须自己完成大部分工作。
在您的示例中,您需要查找功能,例如用于预订对象的单例标题注册表。
由于您的标识符 title 是一个子元素,因此无法保证 JAXB 会在访问任何其他元素之前访问该 title 元素。解决此问题的最简单方法是将 Unmarshaller 创建的 Book 实例中的属性复制到您的单例 Book 实例中。afterUnmarsal
回调是执行此操作的地方:
class Book {
// ...
private void afterUnmarshal(Unmarshaller reader, Object parent) {
Book singleton = BookRegistry.getInstance().getBook(this.title);
if (this.publisher != null) singleton.setPublisher(this.publisher);
if (this.author != null) singleton.setPublisher(this.publisher);
// ...
}
}
如果您想在运行中从 XML 文档中注册对象,它会稍微复杂一些。在你的情况下,你可能想要这样的东西:
class Book {
// ...
public void setTitle(String title) {
this.title = title;
Book singleton = BookRegistry.getInstance().getBook(this.title);
if (singleton == null) BookRegistry.getInstance().addBook(this.title, this);
}
}
只要您没有嵌套书籍,它就会起作用。