0

SimpleXML を使用して、Java で XML オブジェクトからデータを非整列化しようとしています。全体の要点は、API を JAXB から SimpleXML に変換することでした。したがって、ドキュメントを解析する注釈の方法を使用しました。ここにいくつかのコードがあります:

ユーザー クラスで:

@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 ブロックを配置しても、エラーが発生することです。

したがって、主な問題は、XML の文字列と Date オブジェクトの間でマーシャリング/アンマーシャリングを行う JAXB アダプタのようなアダプタを適切に作成するにはどうすればよいかということだと思います。

4

1 に答える 1

0

問題を修正しました。それは私が取り組んでいた API 自体とは何の関係もありませんでしたが、実際の XML フレームワークによってアンマーシャリングされたときの double から date への変換でした。XML に格納された double はエポック時間 (秒) で、ミリ秒は 10 進数です。SimpleXML は小数を適切に処理できなかったようです。私の回避策は、データを日付にアンマーシャリングする代わりに、double を要求することでした。だから私はアダプター全体を取り除き、ちょうど変更しました

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

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

Simple を使用して事後にこれを Date に変換する方法があると確信していますが、そのままにしておく方がよいと思います。

于 2010-09-14T20:55:51.467 に答える