JiBX 1.2 - Phần 1: Từ mã Java thành lược đồ XML
Cải thiện chất lượng lược đồ bằng phép biến đổi tùy chỉnh các mô hình dữ liệu
Java thành tài liệu XML và từ tài liệu XML
Dennis Sosnoski, Nhà tư vấn, Sosnoski Software Solutions, Inc.
Tóm tắt: Các định nghĩa lược đồ XML là cơ sở cho nhiều kiểu trao đổi dữ liệu,
bao gồm hầu hết các dạng dịch vụ web. Nhưng lược đồ XML là một tiêu chuẩn
phức tạp và hầu hết các công cụ để tạo và sửa đổi các định nghĩa lược đồ không đủ
mạnh mẽ hay dễ sử dụng như các công cụ để làm việc với mã Java™. Các đặc tính
mới của JiBX 1.2 mà bạn sẽ tìm hiểu về nó trong hướng dẫn này —Phần 1 của
một loạt bài viếtcó hai phần —cho phép bạn bắt đầu từ mã Java và dễ dàng tạo ra
các định nghĩa lược đồ có chất lượng khớp với các cấu trúc dữ liệu của bạn. Sau
đó bạn có thể sử dụng trực tiếp các lược đồ này, dù bạn có sử dụng liên kết dữ liệu
JiBX hay không.
h orderNumber bên trong phần tử Bằng cách sử dụng một thuộc tính element="order-num", tùy chỉnh orderNumber ra lệnh cho BindGen diễn tả giá trị này như là một phần tử, chứ không phải dưới dạng thuộc tính mặc định được sử dụng cho một giá trị nguyên thủy. Tùy chỉnh thứ hai là dành cho thuộc tính sưu tập các mục hàng. Tùy chỉnh này sử dụng cả hai thuộc tính item-name và element. Thuộc tính item-name kiểm soát tên được sử dụng cho các giá trị riêng lẻ mà sưu tập biểu diễn, trong khi thuộc tính element bắt buộc sử dụng tên đã cung cấp như là một phần tử bao gói các giá trị trong sưu tập. XML không có các không gian tên Tất cả các ví dụ của hướng dẫn sử dụng các không gian tên XML vì việc sử dụng các không gian tên thường được coi là một thói quen thực tế tốt nhất cho việc trao đổi dữ liệu. Nếu bạn muốn làm việc với XML mà không có các không gian tên, bạn có thể sử dụng một thuộc tính namespace-style="none" ở bất kỳ mức tùy chỉnh nào để tắt hoàn toàn các không gian tên cho tất cả các thành phần lồng bên trong. Các tùy chỉnh của Listing 11 cũng định nghĩa các không gian tên được sử dụng trong tài liệu XML. Các ví dụ trước đó dựa vào BindGen xử lý mặc định các không gian tên, cụ thể là lấy URI không gian tên dùng trong biểu diễn XML của mã Java trong gói Java. Việc xử lý mặc định này đã chuyển đổi gói org.jibx.starter thành URI không gian tên Trong Listing 11, không gian tên được tùy chỉnh bằng cách thêm một cặp hai thuộc tính — namespace="" và namespace-style="fixed" — trên phần tử gốc . Thuộc tính đầu tiên định nghĩa không gian tên cơ sở, còn thuộc tính thứ hai ngăn chặn hành vi thông thường là sửa đổi không gian tên dựa vào gói Java. Cả hai thuộc tính này được thừa kế xuyên qua các phần tử tùy chỉnh lồng vào nhau, vì thế chúng có thể dễ dàng được đặt vào phần tử thay vì phần tử . Bạn có thể thử nghiệm tùy chỉnh trong Listing 11 bằng cách sử dụng đích Ant custgen3 để tạo ra lược đồ và liên kết và đích run3 để chạy một phép thử nghiệm (sau khi sử dụng đích bind tiêu chuẩn để chạy trình biên dịch liên kết JiBX — hoặc chỉ cần sử dụng đích full3 để thực hiện toàn bộ chuỗi tác vụ). Listing 12 hiển thị tài liệu đầu vào được sử dụng với mã thử nghiệm: Listing 12. Mẫu XML với các tên và các không gian tên đã được tùy chỉnh <order order-date="2008-10-18" ship-date="2008-10-22" xmlns=""> 12345678 5678 John Smith 12345 Happy Lane Plunk USA PRIORITY_MAIL 333 River Avenue Kirkland Nếu bạn so sánh mẫu Listing 12 với mẫu Listing 10 bạn sẽ thấy biểu diễn XML đã thay đổi như thế nào bởi các tùy chỉnh mới nhất. Tùy chỉnh các biểu diễn lược đồ Bây giờ bạn đã thấy các tùy chỉnh của BindGen có thể thay đổi biểu diễn XML của dữ liệu Java của bạn như thế nào. Các tùy chỉnh cũng có thể được sử dụng để kiểm soát một số khía cạnh của cấu trúc lược đồ thực tế. Hãy nhớ lại rằng BindGen mặc định sẽ sử dụng các định nghĩa được lồng nhau hơn là các kiểu và các phần tử toàn cục. Nếu bạn xem lại lược đồ được tạo ra trong Listing 9 bạn sẽ thấy cấu trúc lồng nhau này. Lược đồ chỉ sử dụng ba định nghĩa toàn cầu: các kiểu phức hợp địa chỉ (address) và đơn hàng (order) và phần tử order. Các lớp khác trong các cấu trúc dữ liệu Java (Customer, Item, và Shipping) mỗi thứ được tham chiếu chỉ tại một điểm trong lớp Order do đó các định nghĩa kiểu tương ứng được nhúng trực tiếp trong định nghĩa kiểu lược đồ order. Bạn có thể thay đổi kiểu dáng của lược đồ bằng cách sử dụng một thuộc tính force-mapping="true" trên bất kỳ các phần tử tùy chỉnh lồng nhau nào. Listing13 cho thấy tệp tin tùy chỉnh custom4.xml, trong đó bổ sung thêm sự thay đổi này cho các tùy chỉnh custom2.xml khớp với lược đồ đã tạo ra trong Listing 9: Listing 13. Tùy chỉnh cho cấu trúc của lược đồ <class name="Address" includes="street1 street2 city @state @postCode country" requireds="street1 city"/> <class name="Customer" includes="customerNumber firstName lastName" requireds="lastName firstName /customerNumber"/> <class name="Order" requireds="/orderNumber customer billTo shipping orderDate"/> Listing 14 hiển thị cấu trúc lược đồ kết quả (là tệp starter.xsd được tạo ra bằng cách chạy đích custgen4). Phiên bản này của lược đồ biểu diễn cùng một cấu trúc tài liệu XML giống như là lược đồ trong Listing 9 nhưng bao gồm các định nghĩa kiểu riêng biệt khớp với mỗi lớp Java. Listing 14. Cấu trúc lược đồ đã tùy chỉnh <xs:schema xmlns:xs="" xmlns:tns="" elementFormDefault="qualified" targetNamespace=""> Supported shipment methods. The "INTERNATIONAL" shipment methods can only be used for orders with shipping addresses outside the U.S., and one of these methods is required in this case. ... Order line item information. Address information. Customer information. Order information. Get the order number. <xs:element type="tns:item" name="item" minOccurs="0" maxOccurs="unbounded"/> Các lược đồ theo kiểu được hiển thị trong Listing 14, được gọi là các lược đồ kiểu "Cửa chớp lật" (Venetian Blind) được sử dụng phổ biến trong các định nghĩa cấu trúc XML phức hợp. Bằng cách tách riêng từng định nghĩa kiểu, lược đồ kiểu này cho phép bạn dễ dàng sử dụng lại các cấu trúc thành phần khi sửa đổi hoặc mở rộng một lược đồ. Tính linh hoạt của lược đồ kiểu “Venetian Blind” có thể không quan trọng nếu bạn chỉ lập kế hoạch để sử dụng mã Java của bạn làm cơ sở cho bất kỳ thay đổi thêm nào khác (chạy lại BindGen mỗi khi thay đổi mã của bạn), nhưng có thể sẽ tốt hơn, nếu bạn dự định sử dụng lược đồ làm cơ sở cho các phát triển tiếp theo. Các tham số dòng lệnh BindGen BindGen hỗ trợ một số tham số dòng lệnh ngoài những tham số đã dùng trong mã hướng dẫn. Bảng 1 liệt kê các tùy chọn quan trọng nhất: Bảng 1. Các tùy chọn dòng lệnh BuildGen Command Purpose -b name Tên tệp tin định nghĩa liên kết gốc được tạo ra (tên mặc định là binding.xml). -c path Đường dẫn đến tệp tin tùy chỉnh đầu vào. -n uri=name,... Cho cặp URI không gian tên lược đồ và tên-tệp tin (mặc định tạo các tên tệp tin từ các URI không gian tên lược đồ). -p path,... Các đường dẫn để nạp các tệp tin lớp Java (mặc định là đường dẫn được sử dụng để chạy BindGen). -s path,... Các đường dẫn để nạp các tệp mã nguồn Java (nguồn không được sử dụng theo mặc định). -t path Đường dẫn thư mục đích dành cho kết quả đầu ra được tạo ra (mặc định là thư mục hiện tại). -w Xoá tất cả các tệp tin khỏi thư mục đích trước khi sinh ra kết quả đầu ra (bỏ qua nếu thư mục đích cũng là thư mục hiện tại) Bạn cũng có thể chuyển cho BindGen các tùy chỉnh toàn cục dưới dạng các tham số dòng lệnh mà không cần phải tạo ra một tệp tin tùy chỉnh, bằng cách sử dụng kí hiệu -- làm một tiền tố dành riêng cho giá trị của thuộc tính tùy chỉnh. Ví dụ để thiết lập cũng các tùy chọn toàn cầu giống như đã dùng trong các tùy chỉnh của Listing 13, bạn cần thêm --property-access=true --force-mapping=true vào dòng lệnh của BindGen . Không cần dùng dấu nháy kép cho giá trị thuộc tính khi bạn sử dụng kỹ thuật này. Nếu bạn muốn thiết lập một tùy chỉnh cho một danh sách nhiều giá trị, hãy sử dụng các dấu phẩy để phân cách từng giá trị riêng lẻ chứ không phải các khoảng trống (Ví dụ, để bỏ qua các tiền tố m_ và s_ trước các tên trường, bạn sử dụng tham số dòng lệnh --strip-prefixes=m_,s_). Tiến xa hơn Trong hướng dẫn này, bạn đã học những điều căn bản về cách sử dụng JiBX để tạo ra một định nghĩa lược đồ XML từ mã Java của bạn và sau đó chuyển đổi các tài liệu XML khớp với lược đồ này thành cấu trúc dữ liệu Java và ngược lại. Có rất nhiều tùy chỉnh khác mà bạn có thể sử dụng để kiểm soát việc tạo lược đồ, ngoài những thứ mà tôi đã trình bày trong hướng dẫn này. Các tài liệu JiBX cung cấp đầy đủ các chi tiết về tất cả các lựa chọn tùy chỉnh ấy, cùng với nhiều ví dụ về việc tạo lược đồ từ mã Java. Bạn thậm chí có thể tiến xa hơn với JiBX bằng cách làm việc với các định nghĩa liên kết thực tế; nó sẽ cho phép bạn kiểm soát tất cả các bước của quá trình biến đổi. Bạn có thể dễ dàng thêm mã riêng của bạn mà sẽ được thực hiện như là một phần của các phép biến đổi, khi sử dụng các móc nối phần mở rộng của người dùng xây dựng vào trong định nghĩa liên kết. Bạn thậm chí có thể tự viết các mã lệnh tuần tự hóa và không tuần tự hóa tùy biến riêng của bạn để chúng có thể kiểm soát có chọn lọc các mã được JiBX tạo ra để xử lý các cấu trúc XML hoặc cấu trúc dữ liệu Java duy nhất. Tài liệu JiBX bao gồm một hướng dẫn để minh họa nhiều khía cạnh khi làm việc với các định nghĩa liên kết, bao gồm cả các đặc tính mở rộng này, cùng với tài liệu tham khảo có tất cả các thông tin chi tiết. JiBX đặc biệt tiện lợi khi bạn muốn phát triển một định nghĩa lược đồ một cách nhanh chóng để trao đổi dữ liệu mà không cần phải tìm hiểu nhiều về lược đồ. Lược đồ XML tiêu chuẩn là phức tạp và các công cụ để làm việc với các định nghĩa lược đồ cung cấp rất ít hỗ trợ cho việc tổ chức lại và cấu trúc lại các lược đồ. Bằng cách sử dụng mã Java và BindGen làm cơ sở cho sự phát triển lược đồ của bạn như đã chỉ ra trong hướng dẫn này, bạn có thể áp dụng tất cả tính linh hoạt của các IDE Java để tạo ra định nghĩa lược đồ một cách nhanh chóng và dễ dàng mà không phải tự cam kết sử dụng JiBX. JiBX cũng bao gồm một công cụ để tạo ra đầy đủ các định nghĩa lược đồ và WSDL cho các dịch vụ Web dựa trên mã Java. Công cụ này, có tên Jibx2Wsdl, được xây dựng bên trên BindGen. Bạn có thể sử dụng tất cả các tuỳ chỉnh BindGen đã bàn luận trong bài viết này cho các lớp dữ liệu được sử dụng làm đầu vào và đầu ra cho các phương thức dịch vụ của bạn, sao cho lược đồ được tạo ra sẽ phản ánh sở thích của bạn. Tài liệu JiBX cung cấp các chi tiết về cách sử dụng Jibx2Wsdl như thế nào. Trong Phần 2, bạn sẽ tìm hiểu cách sử dụng JiBX để tạo mã Java từ các định nghĩa lược đồ XML.
File đính kèm:
- JiBX 1.2, Phần 1_Từ mã Java thành lược đồ XML.pdf