11 Xử lý XML dễ dàng và hiệu quả: Nâng cấp lên JAXP 1.3
(Đăng ngày 22/06/2006) Trong bài viết này, Neeraj Bajaj thảo luận về cách API Java dành cho xử lý XML (JAXP) 1.3, với các API xác thực và API XPath, cải thiện hỗ trợ kiểu dữ liệu lược đồ XML, bổ sung bảo mật và tăng hiệu suất.

Hình 1.

Mục lục bài viết

Bài viết này giải thích một số khái niệm mới và các tính năng quan trọng được giới thiệu trong Java API cho xử lý XML (JAXP) 1.3. JSR 206 được phát triển chú trọng đến hiệu suất và tính dễ sử dụng. Khung xác thực mới cung cấp nhiều sức mạnh hơn cho bất kỳ ứng dụng nào xử lý lược đồ XML và cải thiện hiệu suất đáng kể. Các API XPath cung cấp quyền truy cập vào môi trường đánh giá XPath. JAXP 1.3 mang đến sự hỗ trợ kiểu dữ liệu Lược đồ XML phong phú hơn cho nền tảng Java bằng cách xác định các kiểu dữ liệu mới ánh xạ tới các kiểu dữ liệu được định nghĩa trong đặc tả Lược đồ XML của W3C: Đặc tả kiểu dữ liệu .

Bắt kịp với sự phát triển của các tiêu chuẩn XML, JAXP 1.3 cũng bổ sung hỗ trợ hoàn chỉnh cho các tiêu chuẩn sau: XML 1.1 , Mô hình Đối tượng Tài liệu (DOM) L3 , XInclude và Simple API cho XML (SAX) 2.0.2 . Tất cả những điều này đã được đưa vào nền tảng Java trong bản phát hành mới nhất của Nền tảng Java, Standard Edition (J2SE) 5.0 , có tên mã là Tiger. Nếu bạn đang sử dụng J2SE 1.3 hoặc 1.4, bạn có thể tải xuống bản triển khai ổn định độc lập của JAXP 1.3 từ java.net .

Bài viết này chủ yếu tập trung vào công việc được thực hiện như một phần của nỗ lực JSR 206 và giải thích các khái niệm Khung xác thực lược đồ mới, cùng với việc cung cấp mã và sơ đồ làm việc. Tất cả các mẫu có sẵn để tải xuống từ đây . Các tính năng mới chính được giới thiệu là:

Khung xác thực lược đồ

JAXP 1.3 giới thiệu Khung xác thực độc lập với lược đồ mới (được gọi là API xác thực). Khung công tác mới này cung cấp nhiều sức mạnh hơn cho ứng dụng xử lý lược đồ XML và có thể thực hiện những điều mà trước đây không thể thực hiện được. Cách tiếp cận mới tạo ra một sự thay đổi cơ bản trong cách xử lý và xác thực XML được thực hiện. Xác thực từng được coi là một phần không thể thiếu của phân tích cú pháp XML và các phiên bản trước của JAXP đã hỗ trợ xác thực như một tính năng của trình phân tích cú pháp XML: a SAXParser hoặc DocumentBuilderinstance.

Các API xác thực mới phân tách xác thực của một tài liệu cá thể như một quá trình độc lập với phân tích cú pháp. Cách tiếp cận mới này có một số ưu điểm. Các ứng dụng phụ thuộc nhiều vào lược đồ XML có thể cải thiện đáng kể hiệu suất của việc xác nhận lược đồ. Có lẽ quan trọng hơn, nhiều vấn đề nan giải trước đây giờ có thể được giải quyết một cách hiệu quả, dễ dàng và an toàn. Hãy xem những gì bạn có thể làm với Khung xác thực lược đồ mới.

Xác thực XML dựa trên bất kỳ lược đồ nào

Mặc dù JAXP 1.3 chỉ yêu cầu hỗ trợ cho ngôn ngữ lược đồ XML W3C, bạn có thể dễ dàng bổ sung hỗ trợ cho các ngôn ngữ lược đồ khác, chẳng hạn như RELAX NG . Các API xác thực cung cấp một lớp khả năng bổ sung mà qua đó các ứng dụng có thể cung cấp các thư viện xác thực chuyên biệt hỗ trợ các ngôn ngữ lược đồ bổ sung. Điều này đạt được bằng cách sử dụng một SchemaFactory lớp có khả năng định vị các triển khai cho các ngôn ngữ lược đồ trong thời gian chạy. Bước đầu tiên là chỉ định ngôn ngữ lược đồ sẽ được sử dụng và có được việc triển khai nhà máy bê tông:

SchemaFactory sf = SchemaFactory.newInstance ();

có thể là Lược đồ XML W3C, Relax NG, v.v.

Nếu hàm này trả về thành công, điều đó có nghĩa là có sẵn một triển khai có khả năng hỗ trợ ngôn ngữ lược đồ được chỉ định. Bắt SchemaFactory triển khai là điểm khởi đầu cho các API xác thực. Bước này đi qua cơ chế khả năng cắm từ lâu đã trở thành cốt lõi của JAXP. Bạn có thể viết mã theo cách mà các ứng dụng có thể chuyển đổi giữa Lược đồ XML W3C và xác thực RELAX NG mà không cần thay đổi một dòng mã nào.

Biên dịch lược đồ

Với các API xác thực mới, ứng dụng có tùy chọn chỉ phân tích cú pháp lược đồ, kiểm tra cú pháp và ngữ nghĩa của lược đồ so với các ràng buộc mà ngôn ngữ lược đồ cụ thể áp đặt. Điều này khá hữu ích khi bạn đang viết một lược đồ và muốn đảm bảo rằng lược đồ đó phù hợp với đặc tả. Các SchemaFactory lớp làm công việc này, tải các lược đồ và cũng chuẩn bị cho họ trong một hình thức đặc biệt biểu diễn dưới dạng một javax.xml.validation.Schema đối tượng có thể được sử dụng để phê chuẩn các văn bản ví dụ dựa trên giản đồ. Một lược đồ có thể bao gồm hoặc nhập các lược đồ khác. Trong trường hợp đó, các lược đồ đó cũng được tải.

Khi đọc một lược đồ, SchemaFactorycó thể cần giải quyết các tài nguyên và có thể gặp lỗi. Như Hình 1 chỉ ra, LSResourceResolvervà một ErrorHandlercó thể được đăng ký trên SchemaFactory. Các ErrorHandler được sử dụng để báo cáo bất kỳ lỗi gặp phải trong sơ đồ biên dịch. Các LSResourceResolverđược sử dụng để tùy chỉnh độ phân giải của các nguồn lực. Đây là một giao diện mới được giới thiệu như một phần của DOM L3. Về mặt chức năng, nó giống như SAX EntityResolver, ngoại trừ việc nó cũng cung cấp thông tin về không gian tên của tài nguyên đang được phân giải – ví dụ: targetNamespacelược đồ XML W3C. (Xem Hình 1)

Đây là một mẫu mã cho thấy cách SchemaFactorycó thể được sử dụng để biên dịch giản đồ và lấy một Schemađối tượng:

 Ngôn ngữ chuỗi = XMLConstants.W3C_XML_SCHEMA_NS_URI;

Nhà máy SchemaFactory = SchemaFactory.newInstance (ngôn ngữ);

factory.setErrorHandler (MyErrorHandler mới ());

factory.setResourceResolver (MyLSResourceResolver mới ());

StreamSource ss = new StreamSource (new File (“mySchema.xsd”)));

Lược đồ giản đồ = factory.newSchema (ss);

Một Schema đối tượng là một biểu diễn bộ nhớ bất biến của lược đồ. Một Schemacá thể có thể được chia sẻ với nhiều cá thể phân tích cú pháp khác nhau, ngay cả khi chúng đang chạy trong các chuỗi khác nhau. Bạn có thể viết ứng dụng để cùng một tập hợp lược đồ chỉ được phân tích cú pháp một lần và cùng một Schemaphiên bản được chuyển đến các phiên bản khác nhau của trình phân tích cú pháp.

(Còn tiếp)

Neeraj Bajaj

FPT Aptech trực thuộc Tổ chức Giáo dục FPT có hơn 25 năm kinh nghiệm đào tạo lập trình viên quốc tế tại Việt Nam, và luôn là sự lựa chọn ưu tiên của các sinh viên và nhà tuyển dụng.
0981578920
icons8-exercise-96