2010-03-30 24 views
8

EMF = Eclipse Modeling Framework¿Cómo usar EMF para leer archivos XML?

Tengo que usar EMF en uno de mis proyectos de clase. Estoy tratando de entender cómo usar los CEM de hacer lo siguiente:

  1. Leer XML,
  2. obtener los valores en objetos.
  3. Use ORM para conservar los valores en los objetos en la base de datos. - Hecho
  4. Obtenga datos de la base de datos usando ORM y genere XML.

Necesito hacer todo eso usando: EMF (no tengo idea de qué) y JPA (DONE).

He usado JAXB y sé que esto se puede hacer utilizando JAXB, pero ¿cómo es (EMF == JAXB) ?!

He creado muchas clases de Java usando EMF, ¡pero hay tantas de ellas! ¿Dónde implemento los métodos de lectura/escritura y cómo ejecuto el proyecto EMF?

Gracias

Update1 INDIRECTA http://www.eclipsezone.com/eclipse/forums/t58829.html

Update2

tengo esquema y he generado el código del modelo utilizando el .xsd. Ahora estoy teniendo problemas para leer los datos del archivo XML.

+0

No creo EMF está diseñado para ese propósito. Es un modelo, no un marco vinculante – Bozho

+0

Se utiliza para enlace XML, estoy seguro de eso. – zengr

+0

@Bozho - EMF es (o se puede usar como) un marco de modelado o un marco vinculante. Depende de dónde empiezas ... y de tu punto de vista. (Este es un aspecto del metamodelado que a menudo se entiende mal. Los modelos se pueden ver como datos, y viceversa). –

Respuesta

4

EMF serializa el modelo de datos utilizando (la forma predeterminada y más popular) XMIResourceImpl, que usa estrictamente el formato XMI, y no una estructura XML personalizada.

Consulte http://eclipsedriven.blogspot.com/ para los artículos sobre EMF y sus casos de uso.

Estoy de acuerdo con otros que afirman que EMF probablemente no es lo que usted quiere aquí.

Si realmente quiero usar EMF con una estructura XML personalizada (es decir, no XMI), probablemente usaría JAXB para ordenar/deshacer mis objetos EMF (EObjects).

Así que EMF no es lo mismo que JAXB y tienen diferentes propósitos y metas. De hecho, es probable que pueda combinar EMF y JAXB de alguna manera. Nunca lo intenté, pero parece que hay casos de uso válidos. (como dije antes, para ordenar/eliminar los objetos EMF de/desde XML)

Para entender EMF, debe cambiar su paradigma. Para empezar, elimine la parte "XML", déjelo ir de su mente. Luego, le sugiero que haga lo siguiente:

  1. Cree un proyecto EMF vacío.
  2. Crea un archivo Ecore simple (.ecore) u obténlo de Internet. O importe desde cualquier archivo XML Schema/UML a un modelo de Ecore.
  3. Haga clic derecho en un EClass y luego "Crear instancia dinámica", esto creará un archivo .xmi.
  4. Abra el archivo .xmi, utilizando Eclipse, esto abrirá el editor EMF para ese modelo. Edita como mejor te parezca.
  5. Inspeccione el contenido del archivo .xmi (editado). Verás que el formato se ajusta exactamente al modelo de Ecore. No podrá cambiar/personalizar la asignación del modelo < -> archivo XMI porque, como su nombre lo indica, XMIResourceImpl solo lee/guarda archivos XMI (que se implementan sobre XML) pero no lee/guarda formato XML arbitrario.

EMF tiene soporte para la lectura/escritura XML Schema metamodelos (es decir,Archivos XSD) con el fin de convertirlos a un metamodelo Ecore, pero no archivos XML que se ajusten a dicho esquema (ni siquiera a Ecore), a menos que estos archivos estén en formato XMI.

por persistir modelos EMF en una base de datos relacional, ver: http://eclipsedriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.html

estoy usando Teneo. (Y, opcionalmente, CDO)

En cuanto a "XML", si nos atenemos a XMI y estar contento con ella, la FEM le hará la vida mucho más más fácil, ya que no es necesario hacer ninguna mapeo (a diferencia JAXB). La desventaja es que nuestros objetos deben ser Objetos EMF.

EMF Los objetos son objetos que se generan por EMF e implementa EObject y extiende directa o indirectamente EObjectImpl. Por lo general, no querrás codificar objetos EMF a mano, sería una tarea ardua. Por otro lado, los "objetos" de JAXB suelen ser POJO de objetos de dominio puro y no tienen requisitos adicionales de JAXB. Tenga en cuenta que, a diferencia de JAXB, los objetos EMF no son POJO. Esto explica otro objetivo diferente entre EMF y JAXB. Su superposición es menor de lo que imaginas.

lectura de XMI (no XML) es muy fácil:

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

La forma normal de hacer este tipo de cosas es comenzar con un esquema XML, luego usar esto para generar el modelo EMF, y luego generar el código Java. Esto se describe en this EMF tutorial.

No necesita implementar métodos de lectura/escritura. En su lugar, utiliza el código de la biblioteca EMF para realizar la importación y exportación XML. No tengo mi copia del libro de EMF frente a mí en este momento, pero está cubierto allí. Alternativamente, observe lo que hace el editor EMF generado cuando carga o guarda una instancia de modelo.

EDITAR

Aquí es una resource utility class de un proyecto basado en EMF he desarrollado hace un par de años. Mire los métodos load*. Tenga en cuenta que esta no es necesariamente la mejor manera de hacer esto ... pero funcionó para mí.

EDIT 2

me di cuenta de que yo estaba usando XMI XML no sin formato. La configuración de un lector XML con un esquema personalizado y (potencialmente) un mapeo de esquema personalizado es probable que sea diferente. Entonces, volviendo a mi respuesta original, ¡mire el código generado!.

+0

¿Puedo comenzar? ¿Qué es la Biblioteca EMF que tiene los métodos para leer/escribir archivos xml? – zengr

0

EMF no está diseñado para leer archivos XML arbitrarios. EMF usa XML como back-end. ¿De dónde vienen sus archivos XML/a qué esquema se ajustan? Si tiene el esquema, puede usarlo para crear un modelo EMF, que a su vez puede leer sus archivos XML.

De lo contrario, tendrías que aplicar ingeniería inversa a un modelo EMF que de hecho se serializaría en tu XML, para que pudieras leerlo, pero eso sería un truco.

Después Update2:

supongo que la siguiente pregunta es, entonces, "¿Qué problema tienes con la carga de los archivos". ¿Cómo lo haces y qué no funciona? ¿O no sabes cómo hacerlo?

Primero tiene que configurar la fábrica para su conjunto de recursos (la representación en memoria del conjunto de archivos con los que desea trabajar), y luego cargar el archivo con getResource (URI, bool). Ejemplo de algunas cosas que estoy haciendo UML:

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); 

que todos deben ser cubiertos en el tutorial que ya tiene el enlace a. Luego, puede usar la API Java generada para trabajar desde 'raíz'.

No tengo experiencia con las cosas de ORM, pero tal vez deberías echar un vistazo a CDO.

+0

por favor revise la actualización2. – zengr

+0

Sí, vale la pena investigar CDO o Teneo cuando busque almacenar modelos EMF en bases de datos. Teneo: http://www.eclipse.org/modeling/emft/?project=teneo – lothar

13

Usted puede leer archivos XML arbitrarios con los CEM, siempre que tenga el XSD para ellos, y que ni siquiera tienen para generar clases Java del XSD.
Escribí sobre esto hace un par de meses, pero pegaré los fragmentos de código aquí también. Para una explicación un poco más detallada, vea la publicación de mi blog en How to load and compare arbitrary XML files with EMF.

primer lugar usted necesita para cargar el XSD e inicializar un par de cosas:

// 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()); 

Después de que usted puede cargar sus archivos XML como lo haría normalmente:

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

Hola @Zsolt Török - ¿En qué paquete encuentro 'ResourceSetFactory'? – Magick

2

que construyeron una pequeña programa que hace una conversión de formato de modelo básico usando emftriple (ex emf4sw), es decir, Ecore XMI (archivo XML) a RDF TTL.

Utilicé algunos de los consejos aquí, ¡gracias chicos!

Tal vez el código fuente puede inspirar: https://github.com/frostyandy2k/model-transformer

Cuestiones relacionadas