Распаковка XML-данных непосредственно в объект - PullRequest
0 голосов
/ 14 сентября 2010

Я пытаюсь разобрать данные из объекта XML в Java, используя SimpleXML.Смысл всего этого состоял в том, чтобы преобразовать API из JAXB в SimpleXML.Поэтому я использовал аннотационный способ разбора документа.Вот некоторый код:

В классе User:

@Element(name="created", required=false)
private Date created;

Программист, который написал API, использовал DateAdapter, чтобы превратить извлеченную строку из XML непосредственно в дату.Я попытался преобразовать его в SimpleXML.Я предполагаю, что Трансформер использовал тот же подход.Вот этот код до и после ...

До:

public class DateAdapter extends XmlAdapter<String, Date> {

  DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  public Date unmarshal(String date) throws Exception {
    return df.parse(date);
  }

  public String marshal(Date date) throws Exception {
    return df.format(date);
  }
}

После:

public class DateAdapter implements Transform<Date> {
  SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

  @Override
  public Date read(String date) throws Exception {
    return df.parse(date);
  }

  @Override
  public String write(Date date) throws Exception {
    return df.format(date);
  }
}

Я предполагаю, что я сделал преобразование неправильно, потому что теперь я получаюНепарсируемые ошибки даты.Странная часть заключается в том, что даже если я помещаю блоки if-else или try-catch в методы read и write, я все равно получаю сообщение об ошибке.

Поэтому я думаю, что главный вопрос заключается в том, как правильно написатьАдаптер как JAXB для маршалла / демаршалла между строкой из XML и объектом Date.

1 Ответ

0 голосов
/ 15 сентября 2010

Я исправил проблему.Это не имело никакого отношения к API, над которым я работал сам, а скорее к преобразованию двойного числа в дату, когда не было обнаружено фактически XML-фреймворком.Двойник, сохраненный в XML, находился в эпоху времени в секундах, с десятичными числами в миллисекундах.SimpleXML не может правильно обрабатывать десятичные дроби.Мой обходной путь состоял в том, чтобы просто попросить двойку вместо того, чтобы данные были перенесены в Date.Так что я избавился от всего адаптера и просто изменил

@Element(name="created", required=false)
private Date created;

на

@Element(name="created", required=false)
private double created;

Я уверен, что есть простой способ преобразовать это в Date после факта, но я думаю, что лучше оставить все как есть.

...