Java 使用JAXB将XML解组到现有对象

Java 使用JAXB将XML解组到现有对象,java,xml,jaxb,Java,Xml,Jaxb,我有一个从一组现有java类生成的xsd,目前它按照预期成功地将XML消息解组到对象中,但是我希望能够做到的是,我有一个对象的现有实例,让解组器简单地更新传递给它的消息中包含的字段 例如(请原谅这里的语法错误,这只是我的想法) 如果我有一本带注释的类书,里面有许多字段、标题、作者、发布等,以及相应的生成的xsd,那么如果我收到以下xml,我希望能够将许多字段设置为非必需字段 <Book> <title>Dummys guide to JAXB</title>

我有一个从一组现有java类生成的xsd,目前它按照预期成功地将XML消息解组到对象中,但是我希望能够做到的是,我有一个对象的现有实例,让解组器简单地更新传递给它的消息中包含的字段

例如(请原谅这里的语法错误,这只是我的想法)

如果我有一本带注释的类书,里面有许多字段、标题、作者、发布等,以及相应的生成的xsd,那么如果我收到以下xml,我希望能够将许多字段设置为非必需字段

<Book>
 <title>Dummys guide to JAXB</title>
</Book>

杜米斯JAXB指南

与其简单地创建一个只有标题集的新书实例,不如将其作为更新应用于现有实例,只需在该实例上设置title变量。

JAXB不能为您这样做,不。但是,您可以使用JAXB将XML文档解组到一个新对象上,然后将新对象的特性反射复制到现有对象上


为此提供了一种机制,例如
BeanUtils.copyProperties
方法。不过,我不确定这是否会产生深度复制。

您可以使用JAXB完成这项工作,但大部分工作都必须由您自己完成

在您的示例中,您需要一个查找功能,比如图书对象标题的单例注册表

因为您的标识符title是一个子元素,所以不能保证JAXB会在访问任何其他元素之前访问title元素。最简单的方法是将解组器创建的Book实例中的属性复制到singleton 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);
 }
}

只要您没有嵌套的书籍,它就可以工作。

您可以使用可复制插件从-

实现这一点。哦,是的,我现在正在使用JAXB来解组XML