2010-03-30 29 views
8

EMF = Khuôn khổ mô hình EclipseLàm cách nào để sử dụng EMF để đọc tệp XML?

Tôi phải sử dụng EMF trong một trong các dự án lớp học của mình. Tôi cố gắng để hiểu làm thế nào để sử dụng EMF phải làm như sau:

  1. đọc XML,
  2. Lấy giá trị vào các đối tượng.
  3. Sử dụng ORM để lưu các giá trị trong đối tượng vào cơ sở dữ liệu. - Đã thực hiện
  4. Lấy dữ liệu từ cơ sở dữ liệu bằng cách sử dụng ORM và tạo XML.

Tôi cần thực hiện tất cả những việc đó bằng cách sử dụng: EMF (không biết ý tưởng nào) và JPA (XONG).

Tôi đã sử dụng JAXB và tôi biết, điều này có thể được thực hiện bằng cách sử dụng JAXB, nhưng làm cách nào (EMF == JAXB) ?!

Tôi đã tạo nhiều lớp java bằng EMF, nhưng có rất nhiều trong số đó! Tôi thực hiện phương pháp đọc/ghi ở đâu và làm cách nào để chạy dự án EMF?

Cảm ơn

UPDATE1 GỢI Ý http://www.eclipsezone.com/eclipse/forums/t58829.html

UPDATE2

Tôi có schema và tôi đã tạo ra các mã mô hình sử dụng XSD. Bây giờ tôi đang gặp vấn đề trong việc đọc dữ liệu từ tệp XML.

+0

Tôi không nghĩ EMF được thiết kế cho mục đích đó. Đó là một mô hình, không phải là một khuôn khổ ràng buộc – Bozho

+0

Nó được sử dụng cho XML Binding, tôi chắc chắn về điều đó. – zengr

+0

@Bozho - EMF là (hoặc có thể được sử dụng như) hoặc là một khuôn khổ mô hình hóa hoặc một khuôn khổ ràng buộc. Nó phụ thuộc vào nơi bạn bắt đầu từ ... và quan điểm của bạn. (Đây là một khía cạnh của mô hình meta thường bị hiểu lầm. Các mô hình có thể được xem dưới dạng dữ liệu và ngược lại.) –

Trả lời

4

EMF tuần tự hóa mô hình dữ liệu bằng cách sử dụng (cách mặc định, phổ biến nhất) XMIResourceImpl, trong đó sử dụng nghiêm ngặt định dạng XMI và không phải cấu trúc XML tùy chỉnh.

Xem http://eclipsedriven.blogspot.com/ để biết các bài viết về EMF và các trường hợp sử dụng của EMF.

Tôi đồng ý với những người trả lời khác rằng EMF có lẽ không phải là những gì bạn muốn ở đây.

Nếu tôi thực sự muốn sử dụng EMF với cấu trúc XML tùy chỉnh (nghĩa là không phải XMI), tôi có thể sử dụng JAXB để sắp xếp/unmarshal các đối tượng EMF (EObjects).

Vì vậy, EMF không giống với JAXB và chúng có mục đích và mục tiêu khác nhau. Trong thực tế, bạn có thể kết hợp EMF và JAXB theo một cách nào đó. Tôi chưa bao giờ thử nó, nhưng có vẻ như có trường hợp sử dụng hợp lệ. (như tôi đã nói ở trên, để marshaling/unmarshaling các đối tượng EMF đến/từ XML)

Để hiểu EMF, bạn cần phải chuyển đổi mô hình của mình. Để bắt đầu, hãy xóa phần "XML", hãy để nó thoát khỏi tâm trí bạn. Sau đó, tôi khuyên bạn nên làm như sau:

  1. Tạo một dự án EMF trống.
  2. Tạo tệp Ecore đơn giản (.ecore) hoặc tải tệp từ Internet. Hoặc nhập từ bất kỳ tệp XML Schema/UML nào vào một mô hình Ecore.
  3. Nhấp chuột phải vào EClass sau đó "Tạo Instance động", thao tác này sẽ tạo tệp .xmi.
  4. Mở tệp .xmi, sử dụng Eclipse, thao tác này sẽ mở Trình chỉnh sửa EMF cho mô hình đó. Chỉnh sửa như bạn thấy phù hợp.
  5. Kiểm tra nội dung của tệp .xmi (đã chỉnh sửa). Bạn sẽ thấy rằng định dạng phù hợp chính xác với mô hình Ecore. Bạn sẽ không thể thay đổi/tùy chỉnh ánh xạ từ mô hình < -> tệp XMI vì, như tên của nó, XMIResourceImpl chỉ đọc/lưu các tệp XMI (điều này xảy ra trên đầu XML) nhưng nó không đọc/lưu định dạng XML tùy ý.

EMF hỗ trợ đọc/ghi metamodels XML (tức làCác tệp XSD) cho mục đích chuyển đổi chúng thành một siêu mô hình Ecore, nhưng không phải tệp XML phù hợp với lược đồ như vậy (thậm chí không đến Ecore), trừ khi các tệp này ở định dạng XMI.

Đối với sự bền bỉ mô hình EMF vào một cơ sở dữ liệu quan hệ, xem: http://eclipsedriven.blogspot.com/2010/12/persisting-emf-objects-to-rdbms-with.html

Tôi đang sử dụng Teneo. (Và tùy chọn, CDO)

Về "XML", nếu bạn dính vào XMI và bằng lòng với nó, EMF sẽ làm cho cuộc sống của bạn nhiều dễ dàng hơn, vì bạn không cần phải làm lập bản đồ bất kỳ (không giống như JAXB). Nhược điểm là các đối tượng của chúng ta phải là các đối tượng EMF.

Đối tượng EMF là các đối tượng được tạo bởi EMF và triển khai EObject và mở rộng trực tiếp hoặc gián tiếp EObjectImpl. Bạn thường không muốn mã các đối tượng EMF bằng tay, nó sẽ là một việc vặt. Mặt khác, các đối tượng JAXB "" thường là các đối tượng POJO miền thuần túy và không có yêu cầu bổ sung nào từ JAXB. Lưu ý rằng không giống như JAXB, Các đối tượng EMF không phải là POJO. Điều này giải thích một mục tiêu khác nhau giữa EMF và JAXB. Sự chồng chéo của họ ít hơn bạn tưởng tượng.

Đọc từ XMI (không XML) là rất dễ dàng:

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

Cách thông thường để thực hiện việc này là bắt đầu với một lược đồ XML, sau đó sử dụng nó để tạo mô hình EMF và sau đó tạo mã Java. Điều này được mô tả trong this EMF tutorial.

Bạn không cần triển khai các phương pháp đọc/ghi. Thay vào đó bạn sử dụng mã thư viện EMF để thực hiện nhập và xuất XML. Tôi không có bản sao của cuốn sách EMF trước mặt tôi ngay bây giờ, nhưng nó được bao phủ trong đó. Ngoài ra, hãy xem những gì trình soạn thảo EMF được tạo ra khi bạn tải hoặc lưu một cá thể mô hình.

EDIT

Đây là một resource utility class từ một dự án EMF-based tôi đã phát triển một vài năm trước đây. Nhìn vào các phương pháp load*. Lưu ý rằng đây không nhất thiết phải là cách tốt nhất để làm điều này ... nhưng nó đã làm việc cho tôi.

EDIT 2

Tôi chỉ nhận ra rằng tôi đã sử dụng XMI XML không đơn giản. Định cấu hình trình đọc XML với lược đồ tùy chỉnh và (có thể) ánh xạ giản đồ được tùy chỉnh có thể khác nhau. Vì vậy, quay lại câu trả lời ban đầu của tôi, xem mã được tạo !!.

+0

Bạn có thể bắt đầu, Thư viện EMF có phương pháp đọc/ghi các tệp xml không? – zengr

0

EMF không được thiết kế để đọc các tệp XML tùy ý. EMF sử dụng XML làm phụ trợ. Các tệp XML của bạn đến từ đâu/lược đồ nào chúng phù hợp? Nếu bạn có lược đồ, sau đó bạn có thể sử dụng nó để tạo ra một mô hình EMF, do đó hy vọng có thể đọc các tệp XML của bạn.

Nếu không, bạn sẽ phải thiết kế ngược mô hình EMF thực sự sẽ tuần tự hóa thành XML của bạn, để bạn có thể đọc nó, nhưng đó sẽ là một hack.

Sau UPDATE2:

Tôi đoán câu hỏi tiếp theo sau đó là "vấn đề gì bạn có với tải file của bạn". Làm thế nào để bạn làm điều đó, và những gì không làm việc? Hoặc bạn không biết làm thế nào để làm điều đó?

Trước tiên, bạn phải định cấu hình nhà máy cho bộ tài nguyên của bạn (biểu diễn trong bộ nhớ của tập hợp các tệp bạn muốn làm việc), sau đó tải tệp bằng getResource (URI, bool). Ví dụ về một số công cụ UML tôi đang thực hiện:

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

Điều đó tất cả nên được đề cập trong hướng dẫn mà bạn đã có liên kết đến. Sau đó, bạn có thể sử dụng Java API được tạo để làm việc từ 'root'.

Tôi chưa có kinh nghiệm về công cụ ORM, nhưng có thể bạn nên xem CDO.

+0

vui lòng kiểm tra update2. – zengr

+0

Có, CDO hoặc Teneo sẽ có giá trị điều tra khi llooking để lưu trữ các mô hình EMF trong cơ sở dữ liệu. Teneo: http://www.eclipse.org/modeling/emft/?project=teneo – lothar

13

Bạn có thể đọc các file XML tùy ý với EMF, miễn là bạn có XSD cho họ, và bạn thậm chí không cần phải tạo ra các lớp Java từ XSD.
Tôi viết blog về điều này một vài tháng trước, nhưng tôi cũng sẽ dán đoạn mã ở đây. Để có giải thích chi tiết hơn, hãy xem bài đăng trên blog của tôi theo số How to load and compare arbitrary XML files with EMF.

Trước tiên, bạn cần phải nạp XSD và khởi tạo một vài điều:

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

Sau đó bạn có thể tải file XML của bạn như bạn vẫn thường làm:

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

Xin chào @Zsolt Török - tôi tìm thấy gói 'ResourceSetFactory' ở đâu? – Magick

2

tôi đã xây dựng một nhỏ chương trình thực hiện một số chuyển đổi định dạng mô hình cơ bản bằng cách sử dụng emftriple (cũ emf4sw), tức là Ecore XMI (tệp XML) sang RDF TTL.

Tôi đã sử dụng một số mẹo trong câu trả lời ở đây, vì vậy cảm ơn các bạn!

Có thể mã nguồn có thể truyền cảm hứng cho bạn: https://github.com/frostyandy2k/model-transformer

Các vấn đề liên quan