Pergunta

EMF = estrutura de modelagem Eclipse

Eu tenho que usar o EMF em um dos meus projetos de classe. Estou tentando entender como usar a EMF para fazer o seguinte:

  1. Leia XML,
  2. Coloque os valores em objetos.
  3. Use ORM para persistir os valores nos objetos no banco de dados. - Feito
  4. Obtenha dados do banco de dados usando ORM e gerar XML.

Eu preciso fazer tudo isso usando: EMF (sem ideia do que nunca) e JPA (feito).

Eu usei o JAXB e sei, isso pode ser feito usando o JAXB, mas como é (emf == jaxb)?!

Eu criei muitas aulas de Java usando a EMF, mas existem muitos deles! Onde implemento os métodos de leitura/gravação e como faço para executar o projeto EMF?

Obrigado

Atualização1DICAhttp://www.eclipsezone.com/eclipse/forums/t5829.html

Atualização2

Eu tenho esquema e gerei o código do modelo usando o .xsd. Agora estou tendo problemas em ler os dados do arquivo XML.

Foi útil?

Solução

A EMF serializa o modelo de dados usando (a maneira padrão e mais popular) xmiresourceimpl, que usa rigorosamente o formato XMI, e não uma estrutura XML personalizada.

Ver http://eclipsedriven.blogspot.com/ Para artigos sobre EMF e seus casos de uso.

Eu concordo com outros resposta que a EMF provavelmente não é o que você quer aqui.

Se eu realmente quiser usar o EMF com uma estrutura XML personalizada (ou seja, não XMI), provavelmente usaria o JAXB para marcar/unmarhal meus objetos EMF (EOBjects).

Portanto, o EMF não é o mesmo que o JAXB e eles têm propósitos e objetivos diferentes. Na verdade, você provavelmente pode combinar EMF e JAXB de alguma forma. Eu nunca tentei, mas parece que existem casos de usos válidos. (Como eu disse acima, para organizar/desarmar objetos EMF para/de XML)

Para entender o EMF, você precisa mudar seu paradigma. Para começar, remova a parte "XML", deixe -a sair da sua mente. Então eu sugiro que você faça o seguinte:

  1. Crie um projeto EMF vazio.
  2. Crie um arquivo Ecore simples (.ecore) ou obtenha -o da Internet. Ou importar de qualquer arquivo de esquema XML/UML para um modelo Ecore.
  3. Clique com o botão direito do mouse em um eclass e depois "Criar instância dinâmica", isso criará um arquivo .xmi.
  4. Abra o arquivo .xmi, usando o Eclipse, isso abrirá o editor EMF para esse modelo. Edite como você achar adequado.
  5. Inspecione o conteúdo do arquivo (editado) .xmi. Você verá que o formato está em conformidade exatamente com o modelo Ecore. Você não poderá alterar/personalizar o mapeamento do arquivo model <-> xmi porque, como o nome indica, xmiresourceImpl apenas lê/salva arquivos XMI (que por acaso são implementados no topo do XML), mas não lê/salvar Formato XML arbitrário.

A EMF tem suporte para leitura/escrita Metamodels de esquema XML (por exemplo, arquivos XSD) com o objetivo de convertê -los em um metamodelo Ecore, mas não os arquivos XML que estão em conformidade com esse esquema (nem mesmo à Ecore), a menos que esses arquivos estejam no formato XMI.

Para modelos de EMF persistentes em um banco de dados relacional, consulte:http://eclipsedriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.html

Estou usando Teneo. (e opcionalmente, CDO)

Em relação ao "XML", se você seguir o XMI e se contentar com isso, a EMF fará sua vida Muito de mais fácil, como você não precisa fazer algum Mapeamento (ao contrário do JAXB). A desvantagem é que nossos objetos devem ser objetos EMF.

Objetos EMF são objetos gerados pelo EMF e implementa o EObject e estende direta ou indiretamente o EOBjectImpl. Você geralmente não gostaria de codificar objetos EMF manualmente, seria uma tarefa árdua. Por outro lado, os "objetos" JAXB geralmente são pojos de objeto de domínio puro e não possuem requisitos adicionais do JAXB. Observe que, diferentemente do JAXB, Objetos EMF não são pojos. Isso explica outro objetivo diferente entre o EMF e o JAXB. A sobreposição deles é menor do que você imagina.

Ler do XMI (não XML) é muito fácil:

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

Outras dicas

Você pode ler arquivos XML arbitrários com EMF, desde que você tenha o XSD para eles e nem precisa gerar classes Java a partir do XSD.
Eu escrevi sobre isso há alguns meses, mas também colo os trechos de código aqui. Para uma explicação um pouco mais detalhada, consulte minha postagem no blog sobre Como carregar e comparar arquivos XML arbitrários com EMF.

Primeiro, você precisa carregar o XSD e inicializar algumas coisas:

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

Depois disso, você pode carregar seus arquivos XML como normalmente faria:

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

Eu criei um pequeno programa que faz uma conversão básica de formato de modelo usando o Emftriple (antigo EMF4SW), ou seja, o ECORE XMI (arquivo XML) para RDF TTL.

Eu usei algumas das dicas nas respostas aqui, então obrigado, pessoal!

Talvez o código -fonte possa inspirá -lo: https://github.com/frostyandy2k/model-transformer

A maneira normal de fazer esse tipo de coisa é começar com um esquema XML, depois usar isso para gerar o modelo EMF e gerar código Java. Isso é descrito em Este tutorial da EMF.

Você não precisa implementar métodos de leitura/gravação. Em vez disso, você usa o código da biblioteca EMF para fazer a importação e exportação XML. Não tenho minha cópia do livro da EMF na minha frente agora, mas está coberta lá. Como alternativa, dê uma olhada no que o editor EMF gerado faz ao carregar ou salvar uma instância de modelo.

EDITAR

Aqui está um Classe de utilitário de recursos De um projeto baseado em EMF, desenvolvi alguns anos atrás. Olhe para a load* métodos. Observe que essa não é necessariamente a melhor maneira de fazer isso ... mas funcionou para mim.

Editar 2

Acabei de perceber que estava usando XMI não XML simples. Configurando um leitor XML com um esquema personalizado e (potencialmente) um mapeamento de esquema personalizado provavelmente será diferente. Então, retornando à minha resposta original, Veja o código gerado !!.

O EMF não foi projetado para ler arquivos XML arbitrários. O EMF usa o XML como um back -end. De onde vêm seus arquivos XML/para qual esquema eles estão em conformidade? Se você possui o esquema, poderá usá -lo para criar um modelo EMF, que por sua vez pode ler seus arquivos XML.

Caso contrário, você teria que reverter o engenheiro um modelo EMF que realmente seriam em série para o seu XML, para que você pudesse lê -lo, mas isso seria um hack.

Após a atualização2:

Acho que a próxima pergunta é "que problema você tem com o carregamento de seus arquivos". Como você faz isso e o que não está funcionando? Ou você não sabe como fazer isso?

Você primeiro deve configurar a fábrica para o seu conjunto de recursos (a representação na memória do conjunto de arquivos com os quais deseja trabalhar) e, em seguida, carregue o arquivo com getResource (URI, BOOL). Exemplo para algumas coisas da UML que estou fazendo:

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

Tudo isso deve ser abordado no tutorial para o qual você já tem o link. Em seguida, você pode usar a API Java gerada para trabalhar na 'raiz'.

No entanto, não tenho experiência com o ORM-Stuff, mas talvez você deva dar uma olhada Cdo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top