2010-03-30 13 views
8

ईएमएफ = ग्रहण मॉडलिंग फ्रेमवर्कएक्सएमएल फ़ाइल पढ़ने के लिए ईएमएफ का उपयोग कैसे करें?

मुझे अपनी कक्षा परियोजनाओं में से एक में ईएमएफ का उपयोग करना है। मैं समझने के लिए निम्न कार्य करने के ईएमएफ का उपयोग कैसे करें कोशिश कर रहा हूँ:

  1. पढ़ें एक्सएमएल,
  2. वस्तुओं में मान प्राप्त करें।
  3. डेटाबेस में ऑब्जेक्ट्स में मानों को बनाए रखने के लिए ORM का उपयोग करें। - हो गया
  4. ORM का उपयोग करके डेटाबेस से डेटा प्राप्त करें और XML उत्पन्न करें।

मुझे इसका उपयोग करने की ज़रूरत है: ईएमएफ (अब तक कोई विचार नहीं है) और जेपीए (डीओएन)।

मैंने जेएक्सबी का उपयोग किया है और मुझे पता है, यह जेएक्सबी का उपयोग करके किया जा सकता है, लेकिन कैसे (ईएमएफ == जेएक्सबी) है ?!

मैंने ईएमएफ का उपयोग करके कई जावा कक्षाएं बनाई हैं, लेकिन उनमें से बहुत सारे हैं! मैं पढ़ने/लिखने के तरीकों को कहां लागू करूं और मैं ईएमएफ परियोजना कैसे चला सकता हूं?

धन्यवाद

Update1 संकेत http://www.eclipsezone.com/eclipse/forums/t58829.html

UPDATE2

मैं स्कीमा है और मैं .xsd का उपयोग कर मॉडल कोड जेनरेट किया है। अब मुझे XML फ़ाइल से डेटा पढ़ने में समस्या हो रही है।

+0

मुझे नहीं लगता कि EMF उस उद्देश्य के लिए बनाया गया है। यह एक मॉडलिंग है, बाध्यकारी ढांचे नहीं – Bozho

+0

इसका उपयोग एक्सएमएल बाध्यकारी के लिए किया जाता है, मुझे इसके बारे में निश्चित है। – zengr

+0

@ बोझो - ईएमएफ या तो मॉडलिंग फ्रेमवर्क या बाइंडिंग फ्रेमवर्क है (या इसका उपयोग किया जा सकता है)। यह इस बात पर निर्भर करता है कि आप कहां से शुरू करते हैं ... और आपका दृष्टिकोण। (यह मेटा-मॉडलिंग का एक पहलू है जिसे अक्सर गलत समझा जाता है। मॉडल को डेटा के रूप में देखा जा सकता है, और इसके विपरीत।) –

उत्तर

4

ईएमएफ डेटा मॉडल को (डिफ़ॉल्ट, सबसे लोकप्रिय तरीका) XMIResourceImpl का उपयोग करके क्रमबद्ध करता है, जो सख्ती से एक्सएमआई प्रारूप का उपयोग करता है, न कि एक कस्टम एक्सएमएल संरचना

ईएमएफ और इसके उपयोग के मामलों के बारे में लेखों के लिए http://eclipsedriven.blogspot.com/ देखें।

मैं अन्य उत्तरदाताओं से सहमत हूं कि ईएमएफ शायद आप यहां नहीं चाहते हैं।

यदि मैं वास्तव में एक कस्टम एक्सएमएल संरचना (यानी एक्सएमआई नहीं) के साथ ईएमएफ का उपयोग करना चाहता हूं, तो शायद मैं अपने ईएमएफ ऑब्जेक्ट्स (ईओब्जेक्ट्स) मार्शल/अनमशाल के लिए जेएक्सबी का उपयोग करूंगा।

तो ईएमएफ जेएक्सबी के समान नहीं है और उनके पास विभिन्न उद्देश्यों और लक्ष्यों हैं। वास्तव में आप शायद किसी भी तरह से ईएमएफ और जेएक्सबी को जोड़ सकते हैं। मैंने कभी कोशिश नहीं की है, लेकिन ऐसा लगता है कि वैध उपयोग के मामले हैं। (जैसा कि मैंने उपरोक्त कहा है, एक्सएमएफ ऑब्जेक्ट्स को एक्सएमएल से/एमएमएफ ऑब्जेक्ट्स के लिए)

ईएमएफ को समझने के लिए आपको अपना प्रतिमान स्विच करने की आवश्यकता है। शुरुआत के लिए "एक्सएमएल" भाग को हटा दें, इसे अपने दिमाग से जाने दें। तो मैं आपको निम्न कार्य करने का सुझाव देता हूं:

  1. एक खाली ईएमएफ परियोजना बनाएं।
  2. एक साधारण ईकोर फ़ाइल (.ecore) बनाएं, या इसे इंटरनेट से प्राप्त करें। या किसी भी एक्सएमएल स्कीमा/यूएमएल फ़ाइल से एक इकोर मॉडल में आयात करें।
  3. ईक्लास पर राइट क्लिक करें, फिर "डायनामिक इंस्टेंस बनाएं", यह एक .xmi फ़ाइल बनाएगा।
  4. एक्लिप्स का उपयोग करके .xmi फ़ाइल खोलें, यह उस मॉडल के लिए ईएमएफ संपादक खोल देगा। जैसा कि आप फिट देखते हैं संपादित करें।
  5. (संपादित) .xmi फ़ाइल की सामग्री का निरीक्षण करें। आप देखेंगे कि प्रारूप बिल्कुल इकोर मॉडल के अनुरूप है। आप मॉडल < -> XMI फ़ाइल से मानचित्रण को बदलने/अनुकूलित करने में सक्षम नहीं होंगे क्योंकि, जैसा कि नाम का तात्पर्य है, XMIResourceImpl केवल XMI फ़ाइलों को पढ़ता/सहेजता है (जो एक्सएमएल के शीर्ष पर लागू होता है) लेकिन यह पढ़ता/सहेजता नहीं है मनमाना एक्सएमएल प्रारूप।

ईएमएफ XML स्कीमा मेटामॉडल लेखन/पढ़ने के लिए समर्थन हासिल है (अर्थातएक्सएसडी फाइलें) उन्हें एक इकोर मेटामोडेल में परिवर्तित करने के उद्देश्य से, लेकिन एक्सएमएल फाइलें नहीं हैं जो ऐसी स्कीमा (यहां तक ​​कि इकोर तक नहीं) के अनुरूप होती हैं, जब तक ये फ़ाइलें एक्सएमआई प्रारूप में न हों।

एक संबंधपरक डेटाबेस में EMF मॉडल बने के लिए देखें: http://eclipsedriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.html

मैं Teneo उपयोग कर रहा हूँ। (और वैकल्पिक, सीडीओ)

के बारे में "XML", अगर आप XMI पर कायम है और इसके साथ ही संतोष, EMF अपने जीवन कर देगा बहुत आसान है, तो आप के विपरीत किसी भी मानचित्रण करने की ज़रूरत नहीं है के रूप में (JAXB)। नकारात्मकता यह है कि हमारी वस्तुएं ईएमएफ ऑब्जेक्ट्स होनी चाहिए।

ईएमएफ ऑब्जेक्ट्स ऐसी वस्तुएं हैं जो ईएमएफ द्वारा उत्पन्न होती हैं और ईओब्जेक्ट लागू करती हैं और सीधे या अप्रत्यक्ष रूप से ईओब्जेक्टआईएमपीएल फैली हुई हैं। आप आम तौर पर हाथ से ईएमएफ ऑब्जेक्ट्स को कोड नहीं करना चाहते हैं, यह एक कोर होगा। दूसरी तरफ, जेएक्सबी "ऑब्जेक्ट्स" आमतौर पर शुद्ध डोमेन ऑब्जेक्ट पीओजेओ होते हैं और जेएक्सबी से कोई अतिरिक्त आवश्यकता नहीं होती है। ध्यान दें कि जेएक्सबी के विपरीत, ईएमएफ ऑब्जेक्ट्स पीओजेओ नहीं हैं। यह ईएमएफ और जेएक्सबी के बीच एक और अलग लक्ष्य बताता है। उनका ओवरलैप आप कल्पना करने से कम है। बशर्ते आप उनके लिए XSD है,

XMIResource resource = new XMIResourceImpl(URI.create("file:/path/to/mymodel.xmi")); 
resource.load(null); 
System.out.println(resource.eContents().get(0)); 
1

इस तरह की चीज करने का सामान्य तरीका एक एक्सएमएल स्कीमा से शुरू करना है, फिर इसका उपयोग ईएमएफ मॉडल उत्पन्न करने के लिए करें, और उसके बाद जावा कोड उत्पन्न करें। यह this EMF tutorial में वर्णित है।

आपको पढ़ने/लिखने के तरीकों को लागू करने की आवश्यकता नहीं है। इसके बजाय आप XML आयात और निर्यात करने के लिए ईएमएफ लाइब्रेरी कोड का उपयोग करते हैं। मेरे पास अभी मेरे सामने ईएमएफ पुस्तक की मेरी प्रति नहीं है, लेकिन इसमें वहां शामिल है। वैकल्पिक रूप से, जब आप मॉडल उदाहरण लोड या सहेजते हैं तो उत्पन्न ईएमएफ संपादक क्या करता है, इसे देखें।

संपादित

यहाँ एक EMF आधारित परियोजना मैं कुछ साल पहले विकसित से एक resource utility class है। load* विधियों को देखें। ध्यान दें कि ऐसा करने का यह सबसे अच्छा तरीका नहीं है ... लेकिन यह मेरे लिए काम करता है।

संपादित 2

मैं सिर्फ एहसास हुआ कि मैं XMI सादा नहीं XML का उपयोग किया गया था। एक कस्टम स्कीमा के साथ एक एक्सएमएल रीडर को कॉन्फ़िगर करना और (संभावित रूप से) एक अनुकूलित स्कीमा मैपिंग अलग होने की संभावना है। तो, मेरे मूल उत्तर पर लौट रहा है, जेनरेट कोड को देखो !!

+0

क्या आप एक शुरुआत शुरू कर सकते हैं, ईएमएफ लाइब्रेरी क्या है जिसमें xml फ़ाइलों को पढ़ने/लिखने के तरीके हैं? – zengr

0

ईएमएफ मनमाने ढंग से एक्सएमएल फाइलों को पढ़ने के लिए डिज़ाइन नहीं किया गया है। ईएमएफ एक्सएमएल का बैकएंड के रूप में उपयोग करता है। आपकी एक्सएमएल फाइलें कहां से आती हैं/किस स्कीमा के अनुरूप हैं? यदि आपके पास स्कीमा है, तो आप इसे ईएमएफ मॉडल बनाने के लिए उपयोग कर सकते हैं, जो बदले में आपकी एक्सएमएल फाइलें पढ़ने में सक्षम है।

अन्यथा आपको एक ईएमएफ मॉडल इंजीनियर को रिवर्स करना होगा जो वास्तव में आपके एक्सएमएल को क्रमबद्ध करेगा, ताकि आप इसे पढ़ सकें, लेकिन यह एक हैक होगा।

UPDATE2 के बाद:

मैं अगले सवाल लगता है तो "क्या समस्या आप अपनी फ़ाइलों को लोड करने के साथ है"। आप यह कैसे करते हैं, और क्या काम नहीं कर रहा है? या आप नहीं जानते कि यह कैसे करें?

आपको सबसे पहले अपने संसाधन सेट (उन फ़ाइलों के सेट में इन-मेमोरी प्रस्तुति) के लिए फ़ैक्टरी को कॉन्फ़िगर करना होगा, और फिर फ़ाइल को GetResource (URI, bool) के साथ लोड करें। कुछ यूएमएल सामानों के लिए उदाहरण मैं कर रहा हूं:

resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put(UMLResource.FILE_EXTENSION, UMLResource.Factory.INSTANCE); 
resourceSet.getPackageRegistry().put("http://www.eclipse.org/uml2/2.0.0/UML", UMLPackage.eINSTANCE); 
Resource r = resourceSet.getResource(uriToYourFile,true); 
YourModelRootType root = (YourModelRootType) r.getContents().get(0); 

यह सब ट्यूटोरियल में शामिल होना चाहिए कि आपके पास पहले से ही लिंक है। फिर, आप 'रूट' से काम करने के लिए जेनरेट किए गए जावा एपीआई का उपयोग कर सकते हैं।

मुझे ओआरएम-सामान के साथ कोई अनुभव नहीं है, लेकिन शायद आपको CDO पर एक नज़र रखना चाहिए।

+0

कृपया अद्यतन 2 की जांच करें। – zengr

+0

हां, सीडीओ या टेनो डेटाबेस में ईएमएफ मॉडल स्टोर करने के लिए देख रहे हैं जब जांच के लायक होगा। टेनेओ: http://www.eclipse.org/modeling/emft/?project=teneo – lothar

13

आप ईएमएफ साथ मनमाना एक्सएमएल फाइल पढ़ सकते हैं, और तुम भी जावा वर्गों उत्पन्न करने के लिए की जरूरत नहीं है:

XMI (नहीं एक्सएमएल) से पढ़ना बहुत आसान है एक्सएसडी से।
मैंने इस बारे में कुछ महीने पहले ब्लॉग किया था, लेकिन मैं यहां कोड स्निपेट पेस्ट भी करूंगा। थोड़ी अधिक विस्तृत स्पष्टीकरण के लिए मेरे ब्लॉग पोस्ट को How to load and compare arbitrary XML files with EMF पर देखें। आप अपने एक्सएमएल फाइल लोड कर सकते हैं जैसे आप आमतौर पर करते हैं

// generate EPackages from schemas 
XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder(); 
Collection generatedPackages = xsdEcoreBuilder.generate(schemaURI); 

// register the packages loaded from XSD 
for (EObject generatedEObject : generatedPackages) { 
    if (generatedEObject instanceof EPackage) { 
     EPackage generatedPackage = (EPackage) generatedEObject; 
     EPackage.Registry.INSTANCE.put(generatedPackage.getNsURI(), 
      generatedPackage); 
    } 
} 

// add file extension to registry 
ResourceFactoryRegistryImpl.INSTANCE.getExtensionToFactoryMap() 
    .put(MY_FILE_EXTENSION, new GenericXMLResourceFactoryImpl()); 

उसके बाद:

ResourceSet resourceSet = ResourceSetFactory.createResourceSet(); 
Resource resource = resourceSet.getResource(xmlURI, true); 
resource.load(Collections.EMPTY_MAP); 
EObject root = resource.getContents().get(0); 
+0

हाय @Zsolt Török - मुझे 'रिसोर्ससेट फैक्टरी' में कौन सा पैकेज मिल रहा है? – Magick

2

मैं एक छोटे से बनाया

सबसे पहले आप XSD लोड और चीजों की एक जोड़ी प्रारंभ करने की आवश्यकता प्रोग्राम जो आरएफएफ टीटीएल को एम्फ्रिप्पल (पूर्व emf4sw), यानी ईकोर एक्सएमआई (एक्सएमएल फाइल) का उपयोग करके कुछ बुनियादी मॉडल प्रारूप रूपांतरण करता है।

मैंने यहां जवाबों में से कुछ सुझावों का उपयोग किया, तो धन्यवाद दोस्तों!

हो सकता है कि स्रोत कोड आप को प्रेरित कर सकते हैं: https://github.com/frostyandy2k/model-transformer

संबंधित मुद्दे