(Đăng ngày 27/06/2006) Trước khi xem xét cách tiếp cận này, hãy xem cách chúng tôi đã thực hiện xác thực lược đồ bằng cách sử dụng các thuộc tính lược đồ đã được xác định trong JAXP 1.2 …

Hình 2. Đặt lược đồ đã biên dịch trên DocumentBuilder / SAXParserFactory

Xác thực XML bằng Lược đồ đã Biên dịch

Trước khi xem xét cách tiếp cận này, hãy xem cách chúng ta đã thực hiện xác thực lược đồ bằng cách sử dụng các thuộc tính lược đồ đã được xác định trong JAXP 1.2:

http://java.sun.com/xml/properties/jaxp/schemaLanguagehttp://java.sun.com/xml/properties/jaxp/schemaSource

Dưới đây là một ví dụ cho thấy cách hai thuộc tính này được sử dụng trong JAXP 1.3:

SAXParserFactory spf = SAXParserFactory.newInstance ();spf.setNamespace (true); spf.setValidating (true); SAXParser sp = spf.newSAXParser ();sp.setProperty (“http://java.sun.com/xml/properties/jaxp/schemaLanguage”,”http://www.w3.org/2001/XMLSchema”); sp.setProperty (“http://java.sun.com/xml/properties/jaxp/schemaSource”,”mySchema.xsd”); sp.parse (, <contenthandler);< pre=””></contenthandler);<>

Người dùng đặt schemaLanguagevà / hoặc thuộc schemaSource tính SAXParservà đặt xác thực thành true. Nói chung, một ứng dụng nghiệp vụ xác định một tập hợp các lược đồ chứa các quy tắc nghiệp vụ mà các tài liệu XML phải được xác thực. Để thực hiện điều này, một ứng dụng đặt lược đồ bằng cách sử dụng thuộc schemaSource tính hoặc dựa vào thuộc tính xsi: schemaLocationtrong tài liệu cá thể để chỉ định (các) vị trí lược đồ.

Cách tiếp cận này hoạt động tốt, nhưng có một hình phạt hiệu suất rất lớn: Các lược đồ được chỉ định được tải đi tải lại cho mọi tài liệu XML cần được xác thực! Tuy nhiên, với các API xác thực mới, một ứng dụng chỉ cần phân tích cú pháp một tập hợp các lược đồ một lần. Xem Hình 2.

Sau bước Biên dịch lược đồ , hãy làm như sau.

SAXParserFactory spf = SAXParserFactory.newInstance ();spf.setSchema (lược đồ);SAXParser saxParser = spf.newSAXParser ();saxParser.parse (Tệp mới (“instance.xml”), myHandler);

Chỉ cần thiết lập Schemaphiên bản trên nhà máy và bạn đã hoàn tất. Không cần đặt xác thực truevà không cần đặt schemaLanguagehoặc thuộc schemaSourcetính. Việc xác thực các tài liệu XML được thực hiện dựa trên bộ lược đồ đã biên dịch khi xuất xưởng. Bạn sẽ ngạc nhiên bởi hiệu suất đạt được khi sử dụng phương pháp này. Hãy thử nó cho mình.

Chạy mẫu ComparePerformance.java, có thể tải xuống từ đây . Hiệu suất tăng phần lớn phụ thuộc vào tỷ lệ kích thước của lược đồ XML với kích thước của tài liệu XML. Tỷ lệ lớn hơn dẫn đến hiệu suất lớn hơn. Xem phần Sử dụng lại phiên bản phân tích cú pháp để cải thiện hơn nữa hiệu suất.

Lưu ý rằng sẽ xảy ra lỗi khi sử dụng một trong các thuộc tính sau:

http://java.sun.com/xml/jaxp/properties/schemaLanguagehttp://java.sun.com/xml/jaxp/properties/schemaSource

kết hợp với một Schemađối tượng không rỗng . Cấu hình như vậy sẽ gây ra một SAXExceptionkhi các thuộc tính đó được đặt trên SAXParserhoặc DocumentBuilderFactory.

Xác thực SAXSource hoặc DOMSource

Như chúng tôi đã đề cập trước đó, đã có sự thay đổi cơ bản trong việc phân tích cú pháp và xác thực XML. Bây giờ xác thực XML được coi là một quá trình độc lập với phân tích cú pháp XML. Khi bạn đã Schematải cá thể vào bộ nhớ, bạn có thể làm nhiều việc. Bạn có thể tạo một luồngValidatorHandler có thể xác nhận luồng SAX hoặc tạo một luồng độc lập Validator(xem Hình 3). Một độc lập Validatorcó thể xác thực a SAXSource, a DOMSourcehoặc một tài liệu XML dựa trên bất kỳ lược đồ nào. Trên thực tế, a Validatorvẫn có thể hoạt động nếu SAXluồng hoặc DOMđối tượng đến từ một triển khai khác.

Hình 3. Xác thực SAXSource hoặc DOMSource bằng Trình xác thực

Để nhận được bất kỳ lỗi nào trong quá trình xác thực, ErrorHandler bạn phải đăng ký với Validator. Hãy xem một số mã làm việc. (Lưu ý: Để rõ ràng, chỉ một phần mã được hiển thị ở đây. Để biết nguồn hoàn chỉnh, hãy xem mẫu Validate.java, có thể tải xuống tại đây .)

Trình xác thực trình xác nhận hợp lệ = schema.newValidator ();validator.setErrorHandler (new ErrorHandlerImpl ());validator.validate (StreamSource mới ());

Validatorcũng có thể được sử dụng để xác thực tài liệu hoặc DOMđối tượng cá thể trong bộ nhớ, với kết quả tăng cường được gửi đến DOMResult.

Document document = // đối tượng DOMvalidator.validate (DOMSource mới (tài liệu), DOMResult mới ());

Các API xác thực có thể xác thực một SAXluồng và hoạt động cùng với các API chuyển đổi để đạt được quá trình xử lý đường ống, như chúng ta sẽ thấy trong phần tiếp theo.

 Xác thực XML sau khi chuyển đổi

Các API chuyển đổi được sử dụng để chuyển đổi một tài liệu XML thành một tài liệu khác bằng cách áp dụng một biểu định kiểu. Đôi khi chúng ta cần xác thực tài liệu XML đã chuyển đổi dựa trên một lược đồ. Chúng ta có nên cung cấp tài liệu XML đó cho một trình phân tích cú pháp và sau đó sử dụng tính năng lược đồ để thực hiện xác thực lược đồ không? Không. Các API xác thực mới cung cấp cho bạn sức mạnh để xác thực tài liệu XML đã chuyển đổi dựa trên một lược đồ khác bằng cách cho phép ứng dụng tạo một đường dẫn và chuyển đầu ra của một máy biến áp tới các API xác thực để xác thực theo lược đồ mong muốn. Không quan trọng đầu ra của phép biến đổi là một SAXluồng hay một DOMtrong bộ nhớ.

Xác thực Luồng SAX

Đoạn mã sau cho bạn biết cách sử dụng được thiết kế đặc biệt javax.xml.validation.ValidatorHandlerđể xác thực SAXluồng. Trong nguồn có thể tải xuống , hãy xem mẫu ValidateSAXStream.javađể biết thêm chi tiết. Cũng xem xét mẫu TransformerValidationHandler.java, cho thấy cách liên kết đầu ra của Transformervới ValidatorHandler. Đây là một phần của mã:

Ngôn ngữ chuỗi =   XMLConstants.W3C_XML_SCHEMA_NS_URI;SchemaFactory sf = SchemaFactory.newInstance (ngôn ngữ);Giản đồ schema = sf.newSchema (Tệp mới ()); ValidatorHandler vh = schema.newValidatorHandler ();vh.setErrorHandler (ErrorHandlerImpl mới ());vh.setContentHandler (ApplicationContentHandler mới ()); TransformerFactory tf = TransformerFactory.newInstance ();StreamSource ss = new StreamSource mới ();Máy biến áp t = tf.newTransformer (ss);StreamSource xml = new StreamSource ();t.transform (StreamSource mới (xml, SAXResult mới (vh));

Hình 4 cho thấy toàn bộ luồng, với một tài liệu XML và một biểu định kiểu được cung cấp làm đầu vào cho a Transformervà một SAX luồng là đầu ra. Chúng tôi tận dụng lợi thế của phương pháp mô-đun để thực hiện xác thực độc lập với phân tích cú pháp. Đây ValidatorHandler là một trình xử lý đặc biệt có khả năng làm việc trực tiếp với một SAX luồng. Nó xác nhận luồng và chuyển nó đến ứng dụng.

Hình 4. Xác thực Luồng SAX

(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