Java.util.Date এবং XML গ্রেগরিয়ানক্যালেন্ডারের মধ্যে সাধারণ রূপান্তর


110

আমি java.util.Date এবং javax.xML.datatype.XML গ্রেগরিয়ানক্যালেন্ডার উভয় দিকের মধ্যে রূপান্তর করার একটি সহজ পদ্ধতির সন্ধান করছি।

আমি এখন যে কোডটি ব্যবহার করছি তা এখানে :

import java.util.GregorianCalendar;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;

/**
 * Utility class for converting between XMLGregorianCalendar and java.util.Date
 */
public class XMLGregorianCalendarConverter {  

    /**
     * Needed to create XMLGregorianCalendar instances
     */
    private static DatatypeFactory df = null;
    static {
        try {
            df = DatatypeFactory.newInstance();
        } catch (DatatypeConfigurationException dce) {
            throw new IllegalStateException(
                "Exception while obtaining DatatypeFactory instance", dce);
        }
    }  

    /**
     * Converts a java.util.Date into an instance of XMLGregorianCalendar
     *
     * @param date Instance of java.util.Date or a null reference
     * @return XMLGregorianCalendar instance whose value is based upon the
     *  value in the date parameter. If the date parameter is null then
     *  this method will simply return null.
     */
    public static XMLGregorianCalendar asXMLGregorianCalendar(java.util.Date date) {
        if (date == null) {
            return null;
        } else {
            GregorianCalendar gc = new GregorianCalendar();
            gc.setTimeInMillis(date.getTime());
            return df.newXMLGregorianCalendar(gc);
        }
    }

    /**
     * Converts an XMLGregorianCalendar to an instance of java.util.Date
     *
     * @param xgc Instance of XMLGregorianCalendar or a null reference
     * @return java.util.Date instance whose value is based upon the
     *  value in the xgc parameter. If the xgc parameter is null then
     *  this method will simply return null.
     */
    public static java.util.Date asDate(XMLGregorianCalendar xgc) {
        if (xgc == null) {
            return null;
        } else {
            return xgc.toGregorianCalendar().getTime();
        }
    }
}

আমি কিছু উপেক্ষা করেছি এমন কিছু এপিআই কলগুলির মতো সহজ কিছু আছে কি?

একটি স্ট্যান্ডার্ড এক্সএমএল তারিখ / সময় এবং জাভা তারিখের অবজেক্টের মধ্যে রূপান্তর করা বেশ সুন্দর রুটিন কাজ বলে মনে হচ্ছে এবং আমি অবাক হয়েছি যে আমাকে এই কোডটি লিখতে হবে।

কোনও পরামর্শ?

দ্রষ্টব্য : আমার JAXB ক্লাসগুলি স্কিমা থেকে স্বয়ংক্রিয়ভাবে তৈরি। আমার প্রকল্পের বিল্ড প্রক্রিয়াটি আমাকে উত্পন্ন শ্রেণিতে ম্যানুয়াল পরিবর্তন করতে দেয় না। এক্সএক্সসি: ক্লাসে এক্সএমসি গ্রেগরিয়ানক্যালেন্ডার হিসাবে এক্সজেসি দ্বারা ডেটটাইম উপাদান তৈরি করা হচ্ছে। স্কিমাটি পর্যায়ক্রমে প্রসারিত এবং টুইট করা হয়, সুতরাং আমাকে স্কিমা এক্সএসডি ফাইলে সীমাবদ্ধ পরিবর্তন করার অনুমতি দেওয়া হচ্ছে।

সমাধান অন ​​আপডেট: ব্লাইজের প্রস্তাবিত সমাধানটি আমাকে এক্সএমএল গ্রেগরিয়ানক্যালেন্ডারকে মিশ্রণ থেকে বের করে জাভা.ইটিল.ক্যালেন্ডার অবজেক্টের পরিবর্তে ডিল করার অনুমতি দিয়েছে। আমার স্কিমা ফাইলের শীর্ষে একটি জ্যাকএক্সবি বাইন্ডিং ক্লজ যুক্ত করে, এক্সজেসি আমার জ্যাক্সবি ক্লাসে xs: ডেটটাইমের জন্য আরও উপযুক্ত ম্যাপিং তৈরি করতে সক্ষম। এখানে কিছু স্নিপেট রয়েছে যা আমার এক্সএসডি ফাইলে পরিবর্তনগুলি দেখায়।

এক্সএসডি ফাইলে মূল উপাদান:

<xs:schema xmlns:mydata="http://my.example.com/mydata" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" targetNamespace="http://my.example.com/mydata" elementFormDefault="unqualified" attributeFormDefault="unqualified" version="0.2" xml:lang="en" jaxb:version="2.0">

জ্যাকএক্সবি বাইন্ডিং এন্ডোটেশন ব্লক, এক্সএসডিতে মূল উপাদানটির সাথে সাথে sertedোকানো হয়েছে:

<xs:annotation>
    <xs:appinfo>
        <jaxb:globalBindings>
            <jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime" parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime" printMethod="javax.xml.bind.DatatypeConverter.printDateTime" />
        </jaxb:globalBindings>
    </xs:appinfo>
</xs:annotation>

যেহেতু এক্সএমএল এক্সস: ডেটটাইম ক্ষেত্রটি টাইমজোনও সঞ্চয় করে, তাই যাইহোক যাইহোক তারিখের পরিবর্তে ক্যালেন্ডারের সাথে কাজ করা আমার পক্ষে ভাল কারণ যেহেতু ক্যালেন্ডার অবজেক্টগুলিতে লোকেল এবং টাইমজোনগুলির সাথে কাজ করার জন্য বেশ ভাল API রয়েছে। যাই হোক না কেন, এক্সএমএল গ্রেগরিয়ানক্যালেন্ডারের পরিবর্তে ক্যালেন্ডার বিষয়গুলি নিয়ে আমি আরও বেশি খুশি। রূপান্তর পদ্ধতির যে কোনও প্রয়োজন নেই যা আমি উপরে উপরে তালিকাভুক্ত করেছি। আমি java.util. তারিখের সমস্ত উপায় পাই না, তবে যথেষ্ট কাছে!


আমি কারও কথা জানি না। তবে আপনার বেশ সুন্দর মনে হচ্ছে - এটি কেবল একটি utilপ্যাকেজে রাখুন এবং এটি ব্যবহার করুন।
বোঝো

একপাশে বাছাই করুন, তবে আপনাকে কেন প্রথম স্থানে এক্সএমএল গ্রেগরিয়ানক্যালেন্ডার অবজেক্টগুলির সাথে ডিল করতে হবে? তারা এক ধরনের বিরক্তিকর। যদি তারা জ্যাক্সবি থেকে আগত হয় তবে সরাসরি জাভা.ইটিল.ডেটে বাঁধতে @XMLTypeAdapter ব্যবহার করা সম্ভব। অবশ্যই যদি আপনি কোনও স্কিমা থেকে স্বয়ংক্রিয়ভাবে জড়িত হন, আপনি পুনঃজেনার করার সময় অবজেক্টগুলি পরিবর্তন করা ঠিক তেমন বিরক্তিকর হতে পারে।
এফিকে

@এফএফ আমি একটি স্কিমা বন্ধ করে দিচ্ছি যাতে আমি উত্পন্ন জেএক্সবি ক্লাসে কোনও ম্যানুয়াল পরিবর্তন করতে পারি না
জিম


1
@ জ্যাকব - এটি নয়। কীভাবে এটি করবেন তা তিনি ইতিমধ্যে নির্ধারণ করেছেন , ব্যবহারের জন্য প্রস্তুত ইউটিলিটি শ্রেণি নেই কিনা তা নিয়ে তিনি আশ্চর্য হয়ে যান।
বোঝো

উত্তর:


46

এক্সএমসি গ্রেগরিয়ানক্যালেন্ডারের পরিবর্তে জাভা.ইটিল.ডেট ক্ষেত্র তৈরি করতে XJC কে বলতে কোনও বাহ্যিক বাঁধাই ফাইলটি ব্যবহার করবেন না কেন?

এছাড়াও আমি কীভাবে এক্স ম্যাপ করব: জাভা.ইটিল.ডেটের তারিখ? ব্লগ


আমি এটি খতিয়ে দেখব। ধন্যবাদ।
জিম শক্ত 18

সমস্যা নেই. JAXB java.util.Date প্রকারটি পরিচালনা করতে পারে, আপনার এটি কেবল আপনার মডেলটিতে তৈরি করা দরকার। কৌতুকপূর্ণ হতে পারে।
বিডৌঘান

এটা আমার জন্য কাজ করে। আমি কী করেছি সে সম্পর্কে বিশদ জানতে আমার প্রশ্নের সম্পাদনাগুলি দেখুন।
জিম শক্ত

আমি জ্যাক্সবি বাইন্ডিংগুলি যুক্ত করেছি তবে এক্স এর ঠিক নীচে: স্কিমা এবং আমি নিম্নলিখিত ত্রুটিটি পেয়েছি: com.sun.istack.SAXParseException2: সংকলক এই গ্লোবালবাইন্ডিংস কাস্টমাইজেশনটিকে সম্মান করতে অক্ষম। এটি কোনও ভুল জায়গার সাথে সংযুক্ত, বা অন্যান্য বাঁধার সাথে এর বেমানান। com.sun.tools.xjc.ErrorReceiver.error (ত্রুটিআরসিভার.জভা:86) এ ..
pri

@ প্রিটম - এটি আরও একটি উদাহরণ যা সাহায্য করতে পারে: ব্লগ.বিডোঘন ডটকম / ২০১০ / ২০১৮ / এক্সএমএল- স্কেমা- টু- জাভা- জেনারেটিং এইচটিএমএল । আপনি যে ইস্যুটি দেখছেন তার জন্য এটি একটি নতুন প্রশ্নকে দেখার মতো হতে পারে।
বিডুঘন

81

এক্সএমএল গ্রেগরিয়ানক্যালেন্ডার থেকে জাভা ইউটি.ডেটে আপনি সহজেই তা করতে পারেন:

java.util.Date dt = xmlGregorianCalendarInstance.toGregorianCalendar().getTime();  

ধন্যবাদ ... আমি এক্সএমএল গ্রেগরিয়ানক্যালেন্ডারকে সময়ে সময়ে মিলিতে রূপান্তর করার জন্য একটি উপায় খুঁজছিলাম।
আন্দিজ

6

জাভা.ইউটি.ল তারিখ থেকে এক্সএমএল গ্রেগরিয়ানক্যালেন্ডারে আপনি কেবল এটি করতে পারেন:

import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.datatype.DatatypeFactory;
import java.util.GregorianCalendar;
......
GregorianCalendar gcalendar = new GregorianCalendar();
gcalendar.setTime(yourDate);
XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gcalendar);

@ এফ-পুরাসের প্রথম মন্তব্যের পরে কোড সম্পাদিত হয়েছে, কারণ আমি একটি ভুল করি।


1
আপনি যেভাবে লিখেছেন সেভাবে কাজ করে না: গ্রেগরিয়ানক্যালেন্ডার.সেটটাইম () কোনও কিছুই ফেরত দেবে না।
f_puras

5

এটিকে কার্যকর করার জন্য আমাকে কিছু পরিবর্তন করতে হয়েছিল, কারণ এর মধ্যে কিছু জিনিস পরিবর্তিত হয়েছে বলে মনে হচ্ছে:

  • এক্সজেসি অভিযোগ করবে যে আমার অ্যাডাপ্টারটি এক্সএমএলএডাপ্টার প্রসারিত করে না
  • কিছু উদ্ভট এবং অপ্রয়োজনীয় আমদানি আঁকা হয়েছিল (org.w3._2001.xmlschema)
  • স্পষ্টতই, এক্সএমএলডাপ্টারের প্রসারিত করার সময় পার্সিং পদ্ধতিগুলি স্থির হওয়া উচিত না not

এখানে একটি কার্যকারী উদাহরণ, আশা করি এটি সাহায্য করবে (আমি জোডটাইম ব্যবহার করছি তবে এই ক্ষেত্রে সিম্পলডেট যথেষ্ট হবে):

import java.util.Date;
import javax.xml.bind.DatatypeConverter;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import org.joda.time.DateTime;

public class DateAdapter extends XmlAdapter<Object, Object> {
    @Override
    public Object marshal(Object dt) throws Exception {
        return new DateTime((Date) dt).toString("YYYY-MM-dd");
    }

    @Override
        public Object unmarshal(Object s) throws Exception {
        return DatatypeConverter.parseDate((String) s).getTime();
    }
}

এক্সএসডি-তে, আমি উপরে বর্ণিত দুর্দান্ত উল্লেখগুলি অনুসরণ করেছি, তাই আমি এই এক্সএমএল টিকাটি অন্তর্ভুক্ত করেছি:

<xsd:appinfo>
    <jaxb:schemaBindings>
        <jaxb:package name="at.mycomp.xml" />
    </jaxb:schemaBindings>
    <jaxb:globalBindings>
        <jaxb:javaType name="java.util.Date" xmlType="xsd:date"
              parseMethod="at.mycomp.xml.DateAdapter.unmarshal"
          printMethod="at.mycomp.xml.DateAdapter.marshal" />
    </jaxb:globalBindings>
</xsd:appinfo>

1
আমি যখন এই প্রশ্নটি উত্থাপন করেছি তখন থেকেই আমি জোদা টাইম ভক্ত হয়েছি। জাভা এসই তারিখ এবং সময় শ্রেণীর চেয়ে অনেক ভাল। সময় অঞ্চলগুলি পরিচালনা করার জন্য দুর্দান্ত!
জিম শক্ত

1

আমারও এ জাতীয় মাথাব্যথা ছিল। আমার পোগোতে সময় ক্ষেত্রকে আদিম দীর্ঘ হিসাবে উপস্থাপন করে এ থেকে মুক্তি পেয়েছি। এখন আমার ডাব্লুএস ক্লায়েন্ট কোডের প্রজন্ম সবকিছু ঠিকঠাকভাবে পরিচালনা করে এবং এক্সএমএল থেকে জাভা ক্রেপ নেই। এবং অবশ্যই জাভা সাইডে মিলিসের সাথে ডিল করা সহজ এবং বেদনাদায়ক। কেআইএসএসের নীতিমালা শিল!


1

আপনি ডিফল্ট ম্যাপিং java.util.Date এ পরিবর্তন করতে এই কাস্টমাইজেশনটি ব্যবহার করতে পারেন

<xsd:annotation>
<xsd:appinfo>
    <jaxb:globalBindings>
        <jaxb:javaType name="java.util.Date" xmlType="xsd:dateTime"
                 parseMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.parseDateTime"
                 printMethod="org.apache.cxf.xjc.runtime.DataTypeAdapter.printDateTime"/>
    </jaxb:globalBindings>
</xsd:appinfo>


0

মার্শালিংয়ের সময় ক্যালেন্ডার এবং তারিখটি অনুকূলিতকরণ

পদক্ষেপ 1: কাস্টম সম্পত্তিগুলির জন্য jaxb বাইন্ডিং এক্সএমএল প্রস্তুত করুন, এই ক্ষেত্রে আমি তারিখ এবং ক্যালেন্ডারের জন্য প্রস্তুত করেছি

<jaxb:bindings version="2.1" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<jaxb:globalBindings generateElementProperty="false">
<jaxb:serializable uid="1" />
<jaxb:javaType name="java.util.Date" xmlType="xs:date"
    parseMethod="org.apache.cxf.tools.common.DataTypeAdapter.parseDate"
    printMethod="com.stech.jaxb.util.CalendarTypeConverter.printDate" />
<jaxb:javaType name="java.util.Calendar" xmlType="xs:dateTime"
    parseMethod="javax.xml.bind.DatatypeConverter.parseDateTime"
    printMethod="com.stech.jaxb.util.CalendarTypeConverter.printCalendar" />


সেটপ 2: নীচে উল্লিখিত মত xsd বিকল্পে অ্যাপাচি বা কোনও সম্পর্কিত প্লাগইনগুলিতে কাস্টম জ্যাক্সবি বাইন্ডিং ফাইল যুক্ত করুন

<xsdOption>
  <xsd>${project.basedir}/src/main/resources/tutorial/xsd/yourxsdfile.xsd</xsd>
  <packagename>com.tutorial.xml.packagename</packagename>
  <bindingFile>${project.basedir}/src/main/resources/xsd/jaxbbindings.xml</bindingFile>
</xsdOption>

সেটপ 3: ক্যালেন্ডার রূপান্তরকারী ক্লাসের জন্য কোড লিখুন

package com.stech.jaxb.util;

import java.text.SimpleDateFormat;

/**
 * To convert the calendar to JaxB customer format.
 * 
 */

public final class CalendarTypeConverter {

    /**
     * Calendar to custom format print to XML.
     * 
     * @param val
     * @return
     */
    public static String printCalendar(java.util.Calendar val) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss");
        return simpleDateFormat.format(val.getTime());
    }

    /**
     * Date to custom format print to XML.
     * 
     * @param val
     * @return
     */
    public static String printDate(java.util.Date val) {
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
        return simpleDateFormat.format(val);
    }
}

4 সেট: আউটপুট

  <xmlHeader>
   <creationTime>2014-09-25T07:23:05</creationTime> Calendar class formatted

   <fileDate>2014-09-25</fileDate> - Date class formatted
</xmlHeader>
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.