2010-08-04 18 views
8

Tài liệu JAXB giống như một cuốn sách văn bản, và tôi chỉ đơn giản là không có thời gian để tìm hiểu mọi thứ JAXB trước khi tôi cần sử dụng nó.Dòng công việc của JAXB - Cách bạn chuyển sang sử dụng JAXB

Tôi có một XSD, nếu tôi muốn sử dụng JAXB để sắp xếp và loại bỏ quy trình làm việc là gì?

Tôi không cần bất kỳ chi tiết cụ thể nào chỉ là chế độ xem cấp cao.

Điều tôi biết: 1. JAXB có thể được sử dụng để lấy đối tượng và tạo tài liệu XML từ chúng và ngược lại 2. Nó sử dụng một số công cụ bí ẩn có tên là "XJC" mà tôi không thể tìm thấy tải về ANYWHERE trên trang web của họ 3. XJC tạo các lớp cho bạn dựa trên XSD

Trước tiên, Làm cách nào để tìm XJC? Tôi thực sự biết rằng nó được cài đặt trên hệ thống của tôi, không chắc chắn nơi tôi đã nhận nó từ mặc dù.
Thứ hai, bất kể công cụ này là gì và cách nó đến máy của tôi, làm thế nào để nó chạy với phiên bản cập nhật nhất của JAXB? Thứ ba, vì vậy nếu các thay đổi XSD của tôi có thực sự phải tạo lại toàn bộ đối tượng Java, do đó có thể làm mất hiệu lực tất cả các thử nghiệm của tôi? Hoặc tôi có thể định nghĩa đối tượng với ánh xạ XSD để tôi kiểm soát ánh xạ chứ không phải tạo mã mặc định?

Tôi chủ yếu được sử dụng để lấy XML và sử dụng thứ gì đó như xStream để tự điều chỉnh theo cách thủ công, nhưng đó không phải là một tùy chọn cho mục đích của tôi nữa.

Trả lời

15

Giả sử bạn có JDK6;

XJC là trong bin/thư mục JDK của bạn, một cái gì đó như C: \ Program Files (x86) \ Java \ jdk1.6.0_20 \ bin \ xjc.exe

JDK đi kèm với jaxb, trong khi có có thể là phiên bản mới hơn xung quanh từ http://jaxb.java.net/ hoặc các triển khai khác có sẵn, có thể bạn không cần phải quan tâm đến vấn đề này tại thời điểm này.

JAXB có thể làm được rất nhiều điều, tôi không chắc chắn chính xác những gì bạn đang cố gắng hoàn thành. Nếu bạn có xsd, bạn có thể tạo các lớp java từ nó bằng cách chạy ví dụ:

xjc -p com.mypackage myschema.xsd 

Và bao gồm các lớp được tạo trong dự án của bạn (Thông thường bạn sẽ chạy nó như một phần của quá trình xây dựng).

Hoặc tôi có thể xác định đối tượng ánh xạ XSD để tôi kiểm soát ánh xạ, không phải là một số tạo mã mặc định?

Các lớp được tạo chỉ là pojos với một số chú thích, bạn có thể tự tạo các lớp đó và kiểm soát toàn bộ ánh xạ thông qua chú thích.

Như đã nói, jaxb có thể làm rất nhiều thứ, đây chỉ là một số ví dụ cơ bản, SearchParam/Kiểu Tìm là một lớp được tạo ra bởi XJC từ một tùy chỉnh nhỏ XSD

Serialize một đối tượng vào một file XML

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Marshaller marshaller = context.createMarshaller(); 
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
List<String> hours = new LinkedList<String>(); 
hours.add("2009.12.11"); 
hours.add("2009.12.13"); 

SearchParam param = new SearchParam(); 
param.setFilter("greater"); 
param.setHours(hours); 
param.setSearchType(SearchType.Fuzzy); 
marshaller.marshal(param, new FileWriter("/tmp/SearchParam.xml"));  

Deserialize một file xml

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Unmarshaller unMarshaller = context.createUnmarshaller(); 
SearchParam param = (SearchParam) unMarshaller.unmarshal(
        new FileInputStream("/tmp/SearchParam.xml")); 

Deserialize và làm xác nhận schema

JAXBContext context = JAXBContext.newInstance(SearchParam.class); 
Unmarshaller unMarshaller = context.createUnmarshaller(); 
Schema schema = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI) 
       .newSchema(new File("/tmp/schema1.xsd")); 
unMarshaller.setSchema(schema); 
SearchParam param = unMarshaller.unmarshal(
         new FileInputStream("/tmp/SearchParam.xml")); 

Thông tin thêm

+0

Thứ nhất, câu trả lời tuyệt vời, đánh giá cao nó. Câu hỏi: Vì vậy, bạn thường sẽ tạo ra các đối tượng java và sau đó chỉ cần sao chép dán chúng vào dự án của bạn? Bạn nói rằng nó thường sẽ là một phần của kịch bản xây dựng, nhưng điều đó có vẻ ngược lại với tôi, bởi vì sau đó làm thế nào bạn sẽ biết rằng mã bạn đang viết sử dụng các đối tượng đó sẽ biên dịch, ít chạy hơn như mong đợi? Ngoài ra, những thứ như tự động hoàn thành không thể hoạt động vì các đối tượng không tồn tại cho đến khi bạn xây dựng dự án. – walnutmon

+0

Chắc chắn, "sao chép/dán" mã được tạo là ok - nhược điểm là bạn chỉ cần nhớ làm điều đó khi lược đồ thay đổi. Nếu bạn làm điều đó như một phần của bản dựng, tính năng tự động hoàn thành sẽ hoạt động tốt, bạn chỉ cần chạy bản dựng một lần trước. Dự án của bạn có biên dịch hay hoạt động như dự kiến ​​không khác với chạy xjc "bằng tay" và bạn có thể có thử nghiệm đơn vị bắt được hầu hết các lỗi như vậy. – nos

1

Rất có thể bạn đã cài đặt XJC. Kiểm tra thư mục bin của bản cài đặt JDK 6 của bạn. Sau khi tìm thấy nếu bạn chỉ cần chạy XJC nó sẽ cung cấp cho bạn các tùy chọn dòng lệnh.

JAXB là một spec, vì vậy có rất nhiều hiện thực:

  • Metro (RI), các phiên bản sắp xếp chặt chẽ với các bản cập nhật JDK vì vậy nếu bạn có một JDK gần đây bạn nên được tốt.
  • MOXY JAXB, một phần của EclipseLink sẵn ở đây, http://www.eclipse.org/eclipselink/moxy.php

Nếu bạn sửa đổi schema của bạn, bạn sẽ có thể tinh chỉnh mô hình đối tượng của bạn, đặc biệt là với các phần mở rộng MOXY.

Để bắt đầu xem: http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted