.XSD ফাইল থেকে জাভা ক্লাস তৈরি করুন…?


127

আমার কাছে একটি বিশাল কুইকবুকস এসডিকে। এক্সএসডি স্কিমা ফাইল রয়েছে যা এক্সএমএল অনুরোধগুলি / প্রতিক্রিয়াগুলিকে সংজ্ঞা দেয় যা আমি কুইকবুকগুলি থেকে পাঠাতে / গ্রহণ করতে পারি।

আমি এই .XSD ফাইলগুলি থেকে জাভা ক্লাসগুলি সহজেই তৈরি করতে সক্ষম হতে চাই, যা আমি তখন জাভা অবজেক্টগুলিতে এক্সএমএল এবং জাভা অবজেক্টগুলিকে এক্সএমএলে মার্শাল করতে পারি।

এটি করার কোন সহজ উপায় আছে ...?

আদর্শভাবে, এটি রান-টাইমে প্রাথমিক জাভা ডিস্ট্রোর বাইরে কোনও লাইব্রেরির প্রয়োজন হবে না। তবে আমি নমনীয় ...


6
আপনি যদি ম্যানুয়াল জেনারেশন চান, আপনার গ্রহন প্রকল্পে .xsd ফাইলটি রাখুন, ফাইলটি ডান ক্লিক করুন, তারপরে "উত্পন্ন করুন" চাপুন
জুনচেন লিউ

উত্তর:


121

JAXB আপনি যা চান ঠিক তা করে। এটি জেআরই / জেডিকে 1.6 থেকে শুরু করে তৈরি করা হয়েছে


7
দুর্ভাগ্যক্রমে, এই কার্যকারিতাটি আর জাভা ৯-এর মতো উপলভ্য হবে না কারণ এটি জড়িত ক্লাসগুলি (বিশেষত, com.sun.tools.xjc। * ক্লাসগুলি) আর জেডিকে দিয়ে উপলব্ধ হবে না।
মার্কো

4
আমি মনে করি না জেডিকে থেকে এটি অপসারণ করা একটি সমস্যা হওয়া উচিত, কারণ জাভা ডট কম প্রকল্প (উত্তরের সাথে যুক্ত) সম্ভবত স্থায়ী হতে চলেছে।
stmoebius

1
এখানে বর্ণিত হিসাবে , আপনি একটি কমান্ড লাইন আর্গুমেন্ট দ্বারা জাভা 9 এর উপর নির্ভরতা যুক্ত করতে পারেন বা ম্যানুয়ালি নির্ভরতা যুক্ত করতে পারেন।
ম্যাথিয়াস রাঞ্জি

118

উপরের "JAXB ব্যবহার করুন" মন্তব্যগুলিতে প্রসারিত করতে,

উইন্ডোজে "%java_home%\bin\xjc" -p [your namespace] [xsd_file].xsd

যেমন, "%java_home%\bin\xjc" -p com.mycompany.quickbooks.obj quickbooks.xsd

কিছুটা অপেক্ষা করুন, এবং যদি আপনার একটি সুগঠিত এক্সএসডি ফাইল থাকে তবে আপনি কিছু সুবিন্যাসিত জাভা ক্লাস পাবেন


3
দুর্দান্ত, ধন্যবাদ! এনক্যাপসুলেটেড না হয়ে শীর্ষ স্তরের শ্রেণি তৈরি করতে দেখুন: stackoverflow.com/questions/13175224/… । এবং যদি এটি শ্রেণীর নামের দ্বন্দ্বের দিকে পরিচালিত করে, দেখুন: stackoverflow.com/questions/13414407/…
আগামীকাল

38

আপনি যদি 5 মিনিটেরও কম সময়ে জাভা থেকে এক্সএমএল এবং এক্সএমএল থেকে জাভা কোডিং শুরু করতে চান তবে সিম্পল এক্সএমএল সিরিয়ালাইজেশন চেষ্টা করুন। জেএক্সবি এপিআই শিখতে ঘন্টা ব্যয় করবেন না http://simple.sourceforge.net/download/stream/doc/tutorial/tutorial.php

তবে আপনি যদি জ্যাকএক্সবি শেখার বিষয়ে আগ্রহী হন তবে এখানে একটি দুর্দান্ত টিউটোরিয়াল's http://blogs.oracle.com/teera/entry/jaxb_for_simple_java_xml

টিউটোরিয়াল সামগ্রী:

সহজ জাভা-এক্সএমএল সিরিয়ালাইজেশনের জন্য জ্যাকএক্সবি

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

জ্যাকএক্সবিতে প্রচুর দরকারী বৈশিষ্ট্য রয়েছে, আপনি এখানে রেফারেন্স বাস্তবায়নটি পরীক্ষা করে দেখতে পারেন। Kohsuke এর ব্লগ এছাড়াও JAXB সম্পর্কে আরো জানতে একটি ভাল সম্পদ। এই ব্লগ এন্ট্রির জন্য, আমি আপনাকে জ্যাকএক্সবি দিয়ে কীভাবে একটি সাধারণ জাভা-এক্সএমএল সিরিয়ালাইজেশন করব তা দেখাব।

এক্সএমএলে পোজো

ধরা যাক আমার কাছে আইটেম জাভা অবজেক্ট রয়েছে। আমি আইএমএল অবজেক্টটি এক্সএমএল ফর্ম্যাটে সিরিয়াল করতে চাই। আমাকে প্রথমে যা করতে হবে তা হ'ল javax.xML.bind.annotation। * প্যাকেজ থেকে কয়েকটি এক্সএমএল টিকা দিয়ে এই পোজোটিকে টীকায়িত করা। আইটেম.জভা জন্য কোড তালিকা 1 দেখুন

কোড থেকে

  • @XmlRootElement(name="Item") ইঙ্গিত দেয় যে আমি মূল উপাদান হতে চাই।
  • @XmlType(propOrder = {"name", "price"}) XML আউটপুটটিতে উপাদানটি সাজানো হোক এমন আদেশটি নির্দেশ করে।
  • @XmlAttribute(name="id", ...) নির্দেশ করে যে আইডিটি মূল উপাদানটির একটি বৈশিষ্ট্য।
  • @XmlElement(....) ইঙ্গিত দেয় যে আমি দাম এবং নামটি আইটেমের মধ্যে উপাদান হতে চাই।

আমার Item.javaপ্রস্তুত। তারপরে আমি এগিয়ে যেতে এবং আইটেম মার্শাল করার জন্য জ্যাকএক্সবি স্ক্রিপ্ট তৈরি করতে পারি।

//creating Item data object
Item item = new Item();
item.setId(2);
item.setName("Foo");
item.setPrice(200);
.....

JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
//I want to save the output file to item.xml
marshaller.marshal(item, new FileWriter("item.xml"));

সম্পূর্ণ কোড তালিকাভুক্তির জন্য দয়া করে কোড তালিকা 2 দেখুন main.java। আউটপুট কোড তালিকা 3 item.xmlফাইল তৈরি করা হয়। দেখে মনে হচ্ছে:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">

 <ns1:itemName>Foo</ns1:itemName>
<ns1:price>200</ns1:price>

</ns1:item>

সহজ? আপনি বিকল্প হিসাবে আউটপুট এক্সএমএলটিকে পাঠ্য স্ট্রিং, স্ট্রিম, রাইটার, কন্টেন্টহ্যান্ডলার ইত্যাদি হিসাবে চ্যানেল করতে পারেন কেবল মার্শাল (...) পদ্ধতির প্যারামিটারের মতো পরিবর্তন করে

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
// save xml output to the OutputStream instance
marshaller.marshal(item, <java.io.OutputStream instance>);

...
JAXBContext context = JAXBContext.newInstance(item.getClass());
Marshaller marshaller = context.createMarshaller();
StringWriter sw = new StringWriter();
//save to StringWriter, you can then call sw.toString() to get java.lang.String
marshaller.marshal(item, sw);

এক্সএমএল টু পোজো

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

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns1:item ns1:id="2" xmlns:ns1="http://blogs.sun.com/teera/ns/item">
<ns1:itemName>Bar</ns1:itemName>
<ns1:price>80</ns1:price>
</ns1:item>

তারপরে আমি এই এক্সএমএল কোডটি আইটেমের মাধ্যমে আইটেমের মাধ্যমে আনমারশাল করতে পারি

...
ByteArrayInputStream xmlContentBytes = new ByteArrayInputStream (xmlContent.getBytes());
JAXBContext context = JAXBContext.newInstance(Item.getClass());
Unmarshaller unmarshaller = context.createUnmarshaller();
//note: setting schema to null will turn validator off
unmarshaller.setSchema(null);
Object xmlObject = Item.getClass().cast(unmarshaller.unmarshal(xmlContentBytes));
return xmlObject;
...

সম্পূর্ণ কোড তালিকার জন্য কোড লিস্টিং 2 (মেইন.জাভা) দেখুন। এক্সএমএল উত্স স্ট্রিম এবং ফাইল উভয় থেকে অনেক ফর্মে আসতে পারে। আবার পার্থক্য হ'ল পদ্ধতি প্যারামিটার:

...
unmarshaller.unmarshal(new File("Item.xml")); // reading from file
...
// inputStream is an instance of java.io.InputStream, reading from stream
unmarshaller.unmarshal(inputStream);

এক্সএমএল স্কিমা সহ বৈধতা

সর্বশেষ যে জিনিসটি আমি এখানে উল্লেখ করতে চাই তা হ'ল জাভা অবজেক্টে আনমারশেলিংয়ের আগে স্কিমার সাথে ইনপুট এক্সএমএলকে বৈধতা দেওয়া। আমি আইটেম.এসএসডি নামে একটি এক্সএমএল স্কিমা ফাইল তৈরি করি। সম্পূর্ণ কোড তালিকাভুক্তির জন্য দয়া করে কোড তালিকা 4 (আইটেম.এক্সএসডি) দেখুন। এখন আমাকে যা করতে হবে তা হল বৈধতার জন্য এই স্কিমাটি নিবন্ধন করা।

...
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI)
.newSchema(new File("Item.xsd"));
unmarshaller.setSchema(schema); //register item.xsd shcema for validation
...

আমি যখন POJO- তে এক্সএমএল ডেটা আনমারশাল করার চেষ্টা করি, তবে ইনপুট এক্সএমএল যদি স্কিমা অনুসারে রূপ নেয় না, ব্যতিক্রম ধরা পড়বে। সম্পূর্ণ কোড তালিকাভুক্তির জন্য দয়া করে কোড তালিকা 5 দেখুন (অবৈধ_সাইটম.এক্সএমএল)।

javax.xml.bind.UnmarshalException
- with linked exception:
javax.xml.bind.JAXBException caught: null
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: 'item1' is
                                not a valid value for 'integer'.]

এখানে আমি পূর্ণসংখ্যার পরিবর্তে স্ট্রিংয়ের জন্য 'id' বৈশিষ্ট্যটি পরিবর্তন করি।

যদি এক্সএমএল ইনপুটটি স্কিমাটির বিপরীতে বৈধ হয়, তবে এক্সএমএল ডেটা সাফল্যের সাথে আইটেম.জভা অবজেক্টে চিহ্নমুক্ত করা হবে।


1
এটিকে জ্যাকএক্সবির মতো আরও বড় এবং জটিল কিছুয়ের চেয়ে আমার যা প্রয়োজন তার জন্য কাজ করার জন্য এটি খুব প্রতিশ্রুতিবদ্ধ এবং অনেক সহজ এবং সুন্দর looks দুর্ভাগ্যক্রমে, আমি আমার বিদ্যমান .XSD কে .class ফাইলগুলিতে রূপান্তর করার কোনও উপায় দেখতে পাচ্ছি না, যা আসলেই আমার শুরু করা দরকার। এই কাজ করতে একটি উপায় আছে কি?
কিথ পামার জুনিয়র

7
দুর্ভাগ্যক্রমে JAXB টিউটোরিয়াল সহ ব্লগটি অফলাইন।
লুইস সি

আমরা সহজেই jaxb2-ম্যাভেন-প্লাগইন ব্যবহার এটা করতে পারেন, চেক এই টিউটোরিয়াল journaldev.com/1312/...
পঙ্কজ

""% java_home% \ bin \ xjc "-পি [আপনার নামস্থান] [xsd_file] .xsd" সম্পর্কে কী জটিল?
gorefest

30

Eclipse IDE ব্যবহার করে: -

  1. নতুন / বিদ্যমান প্রকল্পে এক্সএসডি অনুলিপি করুন।
  2. আপনার ক্লাসপথে JAXB এর প্রয়োজনীয় জেআর রয়েছে তা নিশ্চিত করুন। আপনি এখানে একটি ডাউনলোড করতে পারেন ।
  3. এক্সএসডি ফাইল -> উত্পন্ন -> জ্যাকএক্সবি ক্লাসে ডান ক্লিক করুন।

17

সবচেয়ে সহজ উপায় হ'ল কমান্ড লাইন ব্যবহার করা। আপনার .xsd ফাইলের ডিরেক্টরি কেবল টাইপ করুন:

xjc myFile.xsd.

সুতরাং, জাভা সমস্ত পোজো উত্পন্ন করবে।


14

মাভেনকে এই উদ্দেশ্যে ব্যবহার করা যেতে পারে, আপনাকে কিছু নির্ভরতা যুক্ত করতে হবে এবং কেবল আপনার অ্যাপ্লিকেশনটি পরিষ্কার করতে হবে। আপনি আপনার টার্গেট ফোল্ডারে স্বয়ংক্রিয়ভাবে তৈরি সমস্ত ক্লাস পাবেন।

এগুলি কেবল লক্ষ্য থেকে পছন্দসই স্থানে অনুলিপি করুন, এখানে পম.এক্সএমএল রয়েছে যা আমি এক্সএসডি ফাইল থেকে ক্লাসযুক্ত তৈরি করতে ব্যবহার করেছি:

    <plugin>
     <groupId>org.codehaus.mojo</groupId>
     <artifactId>jaxb2-maven-plugin</artifactId>

     <executions>
      <execution>
       <goals>
        <goal>xjc</goal>
       </goals>
      </execution>
     </executions>
     <configuration>
      <schemaDirectory>src/main/webapp/schemas/</schemaDirectory>
     </configuration>
    </plugin>

   </plugins>
  </pluginManagement>
 </build>
</project>

কেবলমাত্র আপনার এক্সএসডি ফাইলগুলি "এসসিআর / প্রধান / ওয়েবঅ্যাপ / স্কিমাস /" এর নীচে রাখুন এবং মাভেনগুলি সংকলনের সময় তাদের খুঁজে পাবে।

আশা করি এটি আপনাকে সহায়তা করবে, আরও তথ্য http://www.beingjavaguys.com/2013/04/create-spring-web-services-using-maven.html এ পাওয়া যাবে

আশা করি এটি সাহায্য করবে :)


1
এটি কি রিসোর্স ডিরেক্টরিতে কাজ করে? (এসসিআর / প্রধান / সংস্থান / স্কিমা), কারণ আমি এটি পেতে থাকি:No XSD files found. Please check your plugin configuration.
zygimantus

14

এক্সএমএল বিয়ান এটি করবে। বিশেষত "scomp" কমান্ড।

সম্পাদনা: এক্সএমএল বিয়ানস অবসরপ্রাপ্ত হয়েছে , আরও তথ্যের জন্য এই স্ট্যাকওভারফ্লো পোস্টটি দেখুন।


2
হ্যাঁ, তবে এক্সএমএলবিয়ানগুলি বন্ধ করা হয়েছে।
stmoebius


এক্সএম বিজনস আবার ট্র্যাকের!
মার্কোলপস

7

ভাল সেরা বিকল্প হয় %java_home%\bin\xjc -p [your namespace] [xsd_file].xsd

আমাদের এখানে একটি বিপরীত প্রকৌশল করার বিকল্প আছে কিনা তাও আমার একটি প্রশ্ন রয়েছে। যদি হ্যাঁ আমরা পোজো ক্লাস থেকে এক্সএসডি তৈরি করতে পারি?


এক্সজেসি কেবল জাভা 6
শ্রী

7

আপনি যদি বাহ্যিক লাইব্রেরি ব্যবহার করতে আপত্তি না করেন তবে অতীতে এটি করার জন্য আমি ক্যাস্টর ব্যবহার করেছি ।


আপনি যদি ক্যাস্টর দিয়ে কোড উত্পন্ন করেন তবে এই উত্পন্ন শ্রেণিগুলি কি এখনও বাস্তবে কাস্টারের উপর নির্ভরশীল? বা আমি ক্যাস্টর লাইব্রেরিগুলি ছাড়াই এই ক্লাসগুলিকে কোনও মেশিনে স্থানান্তর করতে পারি এবং তারা এখনও কাজ করতে পারে?
কীথ পামার জুনিয়র

না, উত্পন্ন শ্রেণিগুলি ক্যাস্টর গ্রন্থাগারগুলির উপর নির্ভর করে না।
ডেভ

এটি করার জন্য ক্যাস্টর কীভাবে ব্যবহার করবেন সে সম্পর্কে কোনও ভাল টিউটোরিয়াল আছে? এটি খুব প্রতিশ্রুতিবদ্ধ দেখাচ্ছে ... তবে জাভা হ'ল আমার শক্তিশালী ভাষা নয় not আমি নিশ্চিত নই যে কাস্টর ফাইলগুলি / প্যাকেজগুলি আমাকে ডাউনলোড করতে হবে এবং কীভাবে কোড জেনারেশনটি করা যায় ... কোন ধাপে ধাপে নবাগত উদাহরণগুলি?
কিথ পামার জুনিয়র

: কিভাবে রেড়ির SourceGenerator বর্গ ব্যবহার করার জন্য ডকুমেন্টেশন এই পাতা চেক আউট castor.org/sourcegen.html
মার্ক Novakowski

2
দেখে মনে হচ্ছে
ক্যাস্টর

5

জ্যাকএক্সবি সীমাবদ্ধতা।

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

আমি দেখেছি কনফিগারেশন অংশটি সরাসরি কাজ নয়, এবং বিকাশের পরিবেশ সেটআপ পেতে ঘন্টা ব্যয় করেছে।

তবে আমি এই সমাধানটি বাদ দিয়েছিলাম একটি নির্লিপ্ত সীমাবদ্ধতার কারণে। আমার এক্সএমএল স্কিমা সংজ্ঞা (এক্সএসডি) এর "মান" নাম সহ একটি বৈশিষ্ট্য / উপাদান রয়েছে এবং আমাকে এক্সএসডি যেমন আছে তেমন ব্যবহার করতে হবে। এই খুব সামান্য প্রতিবন্ধকতা আমার বাধ্যবাধক পদক্ষেপটি XJC কে ইতিমধ্যে ব্যবহৃত ত্রুটিযুক্ত "সম্পত্তি 'মান' দিয়ে ব্যর্থ হয়েছে" "

এটি জ্যাকএক্সবি বাস্তবায়নের কারণে, বন্ডিং প্রক্রিয়াটি প্রতিটি শ্রেণিতে কয়েকটি অ্যাট্রিবিউট যুক্ত করে এবং এর মধ্যে একটিতে একটি মান বৈশিষ্ট্য হিসাবে জাভা অবজেক্টগুলি তৈরি করার চেষ্টা করে। এটি যখন আমার এক্সএসডি প্রসেস করেছে তখন অভিযোগ করেছে যে ইতিমধ্যে with নামে একটি সম্পত্তি রয়েছে।


4

জ্যাকএক্সবির এক্সজেসি এটির কোনও সম্ভাব্য উত্তর নয়? আমি একই জিনিস অর্জন করার চেষ্টা করছি। এখনও "চেষ্টা" পর্যায়ে। এক্সজেসি জুড়ে এসেছিল, তাই ভাগ করে নেওয়ার কথা ভাবল।



1

জ্যাকএক্সবি সীমাবদ্ধতা সম্পর্কে কথা বলছি, বিভিন্ন বৈশিষ্ট্যের জন্য একই নাম থাকার সাথে একটি সমাধান এক্সএসডি-তে ইনলাইন জ্যাক্সবি কাস্টমাইজেশন যুক্ত করছে:

+ +

। । বাধ্যতামূলক ঘোষণা। ।

বা বাহ্যিক অনুকূলিতকরণ ...

আপনি এখানে আরও তথ্য দেখতে পারেন: http://jaxb.java.net/tutorial/section_5_3- ওভাররাইডিং- নামসমূহ html

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.