Немаршалинг XML к существующему объекту с помощью JAXB

Если у вас есть контейнеры, ломающие строки, после нескольких часов поиска хорошего решения CSS и не находящие ни одного, я теперь использую вместо этого jQuery:

$('button').click(function(){

  $('nav ul').each(function(){
    
    $parent = $(this).parent();
    
    $parent.width( $(this).width() );
    
  });
});
nav {
  display: inline-block;
  text-align: left; /* doesn't do anything, unlike some might guess */
}
ul {
  display: inline;
}

/* needed style */
ul {
  padding: 0;
}
body {
  width: 420px;
}

/* just style */
body {
  background: #ddd;
  margin: 1em auto;
}
button {
  display: block;
}
nav {
  background: #bbb;
  margin: 1rem auto;
  padding: 0.5rem;
}
li {
  display: inline-block;
  width: 40px;
  height: 20px;
  border: solid thin #777;
  margin: 4px;
  background: #999;
  text-align: center;
}






7
задан robinsad 27 July 2009 в 15:52
поделиться

3 ответа

JAXB не может сделать это за вас, нет. Однако вы могли бы использовать JAXB для демаршалинга вашего XML-документа на новый объект, а затем рефлексивно скопировать свойства нового объекта на существующий.

Commons BeanUtils предоставляет механизм для этого, такие как метод BeanUtils.copyProperties . Я не уверен, что это делает глубокие копии.

5
ответ дан 7 December 2019 в 12:24
поделиться

Вы выполняете эту работу с помощью JAXB, но вы должны делать большую часть работы самостоятельно.

В вашем примере вам нужна возможность поиска, такая как одноэлементный реестр заголовков для объектов книги .

Поскольку ваш идентификатор, title, является дочерним элементом, нет гарантии, что JAXB посетит этот элемент заголовка раньше любого другого элемента. Самый простой способ обойти это - просто скопировать свойства из экземпляра Book, созданного Unmarshaller, в ваш одноэлементный экземпляр 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);
 }
}

, которое будет работать, пока у вас нет вложенных Книг.

0
ответ дан 7 December 2019 в 12:24
поделиться

Вы можете достичь этого, используя плагин Copyable из JAXB2 Commons - Copyable+plugin

0
ответ дан 7 December 2019 в 12:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: