有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

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

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

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

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


共 (3) 个答案

  1. # 1 楼答案

    您可以使用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);
     }
    }
    

    只要你没有嵌套的书就行

  2. # 3 楼答案

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

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