EMF/Generating Dynamic Ecore from XML Schema
EMF and XML - An Introduction
In this Wiki document, i have tried to document the steps involved in Generating Ecore using XML Schema, loading an XML File into an Ecore Model etc.
- Convert a given XSD into Ecore
- Load an XML into the generated Ecore
- Display the loaded Model using a TreeViewer
For this code to execute, you need to include the following plugins as dependencies
Convert a XSD into Ecore
The following code snippet would enable you to load an existing XSD and convert it into an Ecore.
XSDEcoreBuilder xsdEcoreBuilder = new XSDEcoreBuilder(); ResourceSet resourceSet = new ResourceSetImpl(); Collection eCorePackages = xsdEcoreBuilder.generate(URI.createFileURI("D:/model/example.xsd"));
Note: Running this code could get you a nullPointerException or schemaFileNotFoundException. This is due to a ever popular Crimsom DOM bug. Please refer to the following link to find a workaround to this problem.
Manifestation of Crimsom DOM Bug
Load an XML into the Ecore
HashMap options = new HashMap(); options.put(XMLResource.OPTION_EXTENDED_META_DATA, Boolean.TRUE); Resource resource = resourceSet.createResource(URI.createFileURI("D:/model/example.xml")); resource.load(options);
Note: The XML File should contain xsi:schemaLocation. EMF provides this inbuild feature wherein if the XML knows its schema, emf would build the model from the Schema and load the XML without having to perform Step 1.Convert XSD into Schema.
If a Schema name is not provided, XML would be loaded with a default Schema provided by EMF which would consider all the nodes as xsd:anyType.
Since some of the XML Schema specific contructs are not represented directly in Ecore. they are represented as Ecore Annotations. These annotations are termed as ExtendedMetaData and to query them we need to use the ExtendedMetaData APIs. Therefore to load an XML which contains the schemaLocation we need to provide the loading option XMLResource.OPTION_EXTENDED_META_DATA as true as shown in the code above.
Display using a TreeViewer
List factories = new ArrayList(); factories.add(new ResourceItemProviderAdapterFactory()); factories.add(new ReflectiveItemProviderAdapterFactory()); ComposedAdapterFactory adapterFactory = new ComposedAdapterFactory(); TreeViewer tViewer = new TreeViewer(parent); tViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory); tViewer.setLabelProvider(new AdapterFactoryContentProvider(adapterFactory); tViewer.setInput(resourceSet);
--Annamalai.chockalingam.gmail.com 18:06, 10 February 2007 (EST)