3

JAXB を使用して単一の属性を複数のフィールドに非整列化/分割する方法はありますか?

XML ファイルに time 属性を持つ要素があります (XML ファイルは変更できません)。時間属性の精度はマイクロ秒です。したがって、Java Date または Joda DateTime フィールドに属性を格納できません。

サブ秒が整数に保存され、残りがJava Dateに保存される単純なカスタムDateTimeクラスに属性を保存したい(Jodaにアクセスできない)。ただし、単一の属性を日付と整数の両方に非整列化する方法を理解できませんでした。

XML の例:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
    <root>
        <Range start="2001-01-01 01:23:45.012345"/>
    </root>

シンプルなカスタム DateTime クラス:

public class DateTime {
    Date date;
    Integer subseconds;

    public Date getDate() {
        return this.date;
    }
    public void setDate(Date date) {
        this.date = date;
    }

    public Integer getSubseconds() {
        return this.subseconds;
    }
    public void setSubseconds(Integer subseconds) {
        this.subseconds = subseconds;
    }
}

最終的解決

@Blaise Doughan の提案に従って、DateTimeAdapter クラスを作成しました。

public class DateTimeAdapter extends XmlAdapter<String, DateTime> {
    @Override
    public String marshal (DateTime v) {
        return v.toString();
    }

    @Override
    public DateTime unmarshal (String v) {
        return new DateTime(v);
    }
}

更新されたカスタムDateTimeクラス (コンストラクターを追加し、不変にしました):

public class DateTime {
    Date date = new Date();
    Integer subseconds = 0;

    public DateTime(String dateString) {
        if (dateString.matches("^\\d{4}-{\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2}\\.\\d+") {
            try {
                this.date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(dateString.substring(0, 19));
            }
            catch (ParseException ex) {
                ex.printStackTrace();
            }

            this.subseconds = Integer.valueOf(dateString.substring(20));
        }
    }

    public Date getDate() {
        return this.date;
    }

    public Integer getSubseconds() {
        return this.subseconds;
    }

    ...additional methods...
}

非整列化以外の他の領域で使用できるように、代わりにカスタムDateTimeクラス コンストラクターで文字列変換を行うことにしました。XmlAdapterDateTime

アダプターへの参照は次のとおりです。

    @XmlAttribute(name = "start")
    @XmlJavaTypeAdapter(DateTimeAdapter.class)
    private DateTime range;
4

2 に答える 2

5

を活用できますXmlAdapter。のインスタンスをとXmlAdapterの間で変換する責任があります。DateTimeString

public class DateTimeAdapter extends XmlAdapter<String, DateTime> {
    ...
}

次に、 type のプロパティの注釈をXmlAdapter使用してを参照します。@XmlJavaTypeAdapterDateTime

@XmlJavaTypeAdapter(DateTimeAdapter.class)
public DateTime getFoo() {
    return foo;
}
于 2013-11-05T20:06:49.467 に答える
0
String[] dt=start.split(".");
String timeStr=dt[0];
String subsStr=dt.length>1?dt[1]:null;
于 2013-11-05T19:53:37.730 に答える