XML Validation API của Java

Kiểm tra các tài liệu của bạn để tương thích với các lược đồ

Việc xác nhận hợp lệ cho biết liệu một tài liệu có tuân thủ các quy tắc theo quy định của lược đồ không. Các trình phân tích cú pháp và các công cụ khác nhau hỗ trợ các ngôn ngữ lược đồ khác nhau như các DTD (Định nghĩa kiểu tài liệu), Ngôn ngữ Lược đồ XML của W3C (W3C XML Schema Language), RELAX NG và Schematron. Java 5™ bổ sung một API (Giao diện lập trình ứng dụng) xác nhận hợp lệ thống nhất, có thể so sánh các tài liệu với các lược đồ được viết bằng các ngôn ngữ này và các ngôn ngữ khác. Hãy tìm hiểu về API xác nhận hợp lệ XML (XML validation API) này.

Elliotte Rusty Harold, Giáo sư, Polytechnic University

Elliotte Rusty Harold xuất thân từ bang New Orleans nơi mà ông vẫn thỉnh thoảng về thăm những lúc thảnh thơi. Tuy nhiên, ông đang cư trú gần Trung tâm University Town Center, Irvine cùng với vợ ông là Beth và những chú mèo Charm (được đặt tên theo hạt "charm quark" trong vật lý) và Marjorie (đặt tên theo tên của mẹ vợ ông). Trang Web Cafe au Lait của ông đã trở thành một trong những trang Java độc lập nổi tiếng nhất trên Internet, và trang Web phụ của ông, Cafe con Leche, đã trở thành một trong những trang XML phổ biến nhất. Cuốn sách của ông gần đây nhất là Refactoring HTML



10 02 2010 (Xuất bản lần đầu tiên vào ngày 30 11 2011)

10.02.2010 - Dựa vào việc điểm lại các ý kiến người đọc, tác giả đã cập nhật đoạn cuối cùng trong phần Validation (Xác nhận hợp lệ). Chỉ lược đồ là an toàn luồng, còn các trình xác nhận hợp lệ và các nhà máy lược đồ thì không.

Xác nhận hợp lệ là một công cụ mạnh mẽ. Nó cho phép bạn nhanh chóng kiểm tra đầu vào gần giống với dạng bạn mong đợi và nhanh chóng loại bỏ bất kỳ tài liệu nào khác xa với những gì mà quá trình của bạn có thể xử lý. Nếu có một vấn đề với dữ liệu, thì tốt hơn nên tìm ra sớm còn hơn muộn.

Trong ngữ cảnh của Ngôn ngữ đánh dấu mở rộng (XML), việc xác nhận hợp lệ thường liên quan đến việc viết một đặc tả chi tiết cho các nội dung của tài liệu theo bất kỳ một số ngôn ngữ lược đồ nào như XSD (XML Schema Language) của W3C (Hiệp hội mạng toàn cầu), RELAX NG, các DTD (Document Type Definition), và Schematron. Đôi khi thực hiện xác nhận hợp lệ trong khi phân tích cú pháp, đôi lúc ngay sau đó. Tuy nhiên, thường thực hiện nó trước khi bất kỳ bước xử lý đầu vào tiếp theo nào diễn ra. (Mô tả này được vẽ bằng các nét lớn -- có các ngoại lệ).

Cho đến gần đây, API chính xác, nhờ nó các chương trình đã đòi hỏi việc xác nhận hợp lệ, đã thay đổi theo ngôn ngữ lược đồ và trình phân tích cú pháp. Người ta đã thường truy cập các DTD và XSD như là các tùy chọn cấu hình trong SAX (Simple API for XML - API Đơn giản cho XML), DOM (Document Object Model - Mô hình đối tượng tài liệu) và JAXP ( Java™ API for XML Processing - API Java để xử lý XML). RELAX NG đã đòi hỏi một thư viện và API tùy chỉnh. Schematron có thể sử dụng TrAX (Transformations API for XML - API chuyển đổi cho XML); và vẫn còn các ngôn ngữ lược đồ khác đòi hỏi các nhà lập trình tìm hiểu các API nhiều hơn nữa, mặc dù về cơ bản chúng đang thực hiện hoạt động như nhau.

Java 5 đã đưa vào gói javax.xml.validation để cung cấp một giao diện lược đồ-ngôn ngữ-độc lập với các dịch vụ xác nhận hợp lệ. Gói này cũng có sẵn trong phiên bản Java 1.3 và mới hơn khi bạn cài đặt JAXP 1.3 riêng biệt. Trong số các sản phẩm khác, một công cụ thư viện này được gắn kèm với Xerces 2.8.

Xác nhận hợp lệ

API javax.xml.validation sử dụng ba lớp để xác nhận hợp lệ tài liệu: SchemaFactory, SchemaValidator. Nó cũng sử dụng rộng rãi giao diện javax.xml.transform.Source từ TRAX để mô tả các tài liệu XML. Tóm lại SchemaFactory (Nhà máy lược đồ) đọc tài liệu lược đồ (thường là một tệp XML) mà từ đó nó tạo một đối tượng Schema (Lược đồ). Đối tượng Schema tạo một đối tượng Validator (Trình xác nhận hợp lệ). Cuối cùng, đối tượng Validator xác nhận hợp lệ một tài liệu XML được mô tả như là một đối tượng Source.

Liệt kê 1 cho thấy một chương trình đơn giản để xác nhận hợp lệ một địa chỉ URL được nhập vào dòng lệnh dựa trên lược đồ XSD của DocBook.

Liệt kê 1. Xác nhận hợp lệ một tài liệu XHTML
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class DocbookXSDCheck {

    public static void main(String[] args) throws SAXException, IOException {

        // 1. Lookup a factory for the W3C XML Schema language
        SchemaFactory factory = 
            SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        
        // 2. Compile the schema. 
        // Here the schema is loaded from a java.io.File, but you could use 
        // a java.net.URL or a javax.xml.transform.Source instead.
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
    
        // 3. Get a validator from the schema.
        Validator validator = schema.newValidator();
        
        // 4. Parse the document you want to check.
        Source source = new StreamSource(args[0]);
        
        // 5. Check the document
        try {
            validator.validate(source);
            System.out.println(args[0] + " is valid.");
        }
        catch (SAXException ex) {
            System.out.println(args[0] + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

Dưới đây là một số kết quả điển hình khi kiểm tra một tài liệu không hợp lệ bằng cách sử dụng phiên bản Xerces đi kèm với JDK 5.0 (Java 2 Software Development Kit - Bộ công cụ phát triển phần mềm Java 2):

file:///Users/elharo/CS905/Course_Notes.xml is not valid because cvc-complex-type.2.3: Element 'legalnotice' cannot have character [children], because the type's content type is element-only.

Bạn có thể dễ dàng thay đổi lược đồ cần dựa vào để xác nhận hợp lệ, tài liệu để xác nhận hợp lệ và thậm chí cả ngôn ngữ lược đồ. Tuy nhiên, trong mọi trường hợp, việc xác nhận hợp lệ theo năm bước sau:

  1. Tải một nhà máy lược đồ cho ngôn ngữ viết lược đồ đó.
  2. Biên dịch lược đồ từ nguồn của nó.
  3. Tạo một trình xác nhận hợp lệ từ lược đồ được biên dịch.
  4. Tạo một đối tượng Source (nguồn) cho tài liệu mà bạn muốn xác nhận hợp lệ. StreamSource luôn là đơn giản nhất.
  5. Xác nhận hợp lệ nguồn đầu vào. Nếu tài liệu không hợp lệ, phương thức validate() đưa ra một SAXException. Ngược lại, nó trả về im lặng.

Bạn có thể sử dụng lại cùng trình xác nhận hợp lệ và cùng lược đồ nhiều lần trong loạt bài này. Tuy nhiên, chỉ có lược đồ là an toàn luồng. Các trình xác nhận hợp lệ và các nhà máy lược đồ thì không. Nếu bạn xác nhận hợp lệ cho nhiều luồng đồng thời, hãy chắc chắn rằng mỗi một luồng có các đối tượng ValidatorSchemaFactory.

Xác nhận hợp lệ dựa vào một lược đồ tài liệu-cụ thể

Một số tài liệu chỉ rõ lược đồ mà chúng hy vọng dựa vào để xác nhận hợp lệ, thường sử dụng các thuộc tính xsi:noNamespaceSchemaLocation và/hoặc xsi:schemaLocation như sau:

<document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:noNamespaceSchemaLocation="http://www.example.com/document.xsd">
  ...

Nếu bạn tạo một lược đồ mà không chỉ rõ một địa chỉ URL, tệp, hoặc nguồn, thì ngôn ngữ Java tạo một lược đồ nhìn vào tài liệu đang được xác nhận để tìm ra lược đồ mà nó cần sử dụng. Ví dụ:

SchemaFactory factory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
Schema schema = factory.newSchema();

Tuy nhiên, bình thường đây không phải là những gì bạn muốn. Thông thường người sử dụng tài liệu nên chọn lược đồ, không phải của người tạo tài liệu. Hơn nữa, cách tiếp cận này chỉ làm việc với XSD. Tất cả các ngôn ngữ lược đồ khác yêu cầu chỉ rõ một vị trí lược đồ.


Các nhà máy trừu tượng

SchemaFactory là một nhà máy trừu tượng. Mẫu thiết kế nhà máy trừu tượng cho phép một API này hỗ trợ cho nhiều ngôn ngữ lược đồ và mô hình đối tượng khác nhau. Một công cụ đơn lẻ thường chỉ hỗ trợ một tập con của rất nhiều ngôn ngữ và mô hình. Tuy nhiên, một khi bạn tìm hiểu API để xác nhận hợp lệ các tài liệu DOM dựa vào lược đồ RELAX NG (ví dụ), bạn có thể sử dụng cùng một API để xác nhận hợp lệ các tài liệu JDOM dựa vào các lược đồ W3C.

Ví dụ, Liệt kê 2 cho thấy một chương trình xác nhận hợp lệ các tài liệu DocBook dựa vào lược đồ RELAX NG của DocBook. Nó gần giống như Liệt kê 1. Điều duy nhất đã thay đổi là vị trí của lược đồ và địa chỉ URL xác định ngôn ngữ lược đồ này.

Liệt kê 2. Xác nhận hợp lệ một tài liệu DocBook bằng RELAX NG
import java.io.*;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.*;
import org.xml.sax.SAXException;

public class DocbookRELAXNGCheck {

    public static void main(String[] args) throws SAXException, IOException {

        // 1. Specify you want a factory for RELAX NG
        SchemaFactory factory 
         = SchemaFactory.newInstance("http://relaxng.org/ns/structure/1.0");
        
        // 2. Load the specific schema you want. 
        // Here I load it from a java.io.File, but we could also use a 
        // java.net.URL or a javax.xml.transform.Source
        File schemaLocation = new File("/opt/xml/docbook/rng/docbook.rng");
        
        // 3. Compile the schema.
        Schema schema = factory.newSchema(schemaLocation);
    
        // 4. Get a validator from the schema.
        Validator validator = schema.newValidator();
        
        // 5. Parse the document you want to check.
        String input 
         = "file:///Users/elharo/Projects/workspace/CS905/build/Java_Course_Notes.xml";
        
        // 6. Check the document
        try {
            validator.validate(source);
            System.out.println(input + " is valid.");
        }
        catch (SAXException ex) {
            System.out.println(input + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

Nếu bạn chạy chương trình này với stock Sun JDK và không có thư viện bổ sung nào, bạn sẽ có thể thấy như sau:

Exception in thread "main" java.lang.IllegalArgumentException: 
http://relaxng.org/ns/structure/1.0
	at javax.xml.validation.SchemaFactory.newInstance(SchemaFactory.java:186)
	at DocbookRELAXNGCheck.main(DocbookRELAXNGCheck.java:14)

Điều này là do, ở ngoài hộp, JDK không có một trình xác nhận hợp lệ RELAX NG. Khi ngôn ngữ lược đồ không được ghi nhận, SchemaFactory.newInstance() đưa ra một IllegalArgumentException. Tuy nhiên, nếu bạn cài đặt một thư viện RELAX NG như Jing và một bộ chuyển đổi JAXP 1.3, thì nó có thể đưa ra cùng một câu trả lời như lược đồ W3C.

Nhận biết ngôn ngữ lược đồ

Lớp javax.xml.constants định nghĩa một vài hằng số để xác định ngôn ngữ lược đồ:

  • XMLConstants.W3C_XML_SCHEMA_NS_URI: http://www.w3.org/2001/XMLSchema
  • XMLConstants.RELAXNG_NS_URI: http://relaxng.org/ns/structure/1.0
  • XMLConstants.XML_DTD_NS_URI: http://www.w3.org/TR/REC-xml

Đây không phải là một danh sách đóng. Các công cụ miễn phí thêm các URL vào danh sách này để xác định các ngôn ngữ lược đồ khác. Thông thường, URL là vùng tên URI (Uniform Resource Identifier - mã định danh tài nguyên thống nhất) cho ngôn ngữ lược đồ. Ví dụ, URL http://www.ascc.net/xml/schematron xác định các lược đồ Schematron.

JDK 5 của Sun chỉ hỗ trợ các lược đồ XSD. Mặc dù cũng đã hỗ trợ xác nhận hợp lệ DTD, nhưng nó không thể truy cập thông qua API javax.xml.validation. Đối với các DTD, bạn phải sử dụng lớp XMLReader của SAX chính quy. Tuy nhiên, bạn có thể cài đặt các thư viện bổ sung để tăng thêm sự hỗ trợ cho các ngôn ngữ lược đồ này và các ngôn ngữ lược đồ khác.

Cách bố trí các nhà máy lược đồ

Ngôn ngữ lập trình Java không bị hạn chế vào một nhà máy lược đồ duy nhất. Khi bạn chuyển một URI xác định một ngôn ngữ lược đồ cụ thể tới SchemaFactory.newInstance(), nó tìm kiếm các vị trí sau theo thứ tự này để tìm một nhà máy phù hợp:

  1. Lớp này được đặt tên bởi đặc tính hệ thống "javax.xml.validation.SchemaFactory:schemaURL".
  2. Lớp này được đặt tên bởi đặc tính "javax.xml.validation.SchemaFactory:schemaURL" được tìm thấy trong tệp $java.home/lib/jaxp.properties.
  3. Các nhà cung cấp dịch vụ javax.xml.validation.SchemaFactory được tìm thấy trong các thư mục META-INF/services của bất kỳ các tệp Java Archive (JAR) có sẵn nào.
  4. Một SchemaFactory, com.sun.org.apache.xerces.internal.jaxp.validation.xs.SchemaFactoryImpl mặc định nền tảng trong JDK 5.

Để tăng thêm sự hỗ trợ cho ngôn ngữ lược đồ tùy chỉnh và trình xác nhận hợp lệ tương ứng riêng của bạn, tất cả mọi thứ mà bạn phải làm là viết các lớp con SchemaFactory, SchemaValidator biết cách xử lý ngôn ngữ lược đồ của bạn. Sau đó, cài đặt JAR của bạn vào một trong bốn vị trí nói trên. Điều này rất có ích để bổ sung các ràng buộc dễ dàng được kiểm tra trong một ngôn ngữ Turing-đầy đủ như là Java hơn là trong một ngôn ngữ khai báo như ngôn ngữ Lược đồ XML của W3C. Bạn có thể định nghĩa một ngôn ngữ lược đồ rất nhỏ, viết một công cụ nhanh, và cắm nó vào trong lớp xác nhận hợp lệ.


Các trình xử lý lỗi

Đáp ứng mặc định từ một lược đồ là đưa ra một SAXException nếu có vấn đề và không làm gì cả nếu không có vấn đề. Tuy nhiên, bạn có thể tạo ra một ErrorHandler của SAX để nhận thông tin chi tiết hơn về các vấn đề của tài liệu. Ví dụ, giả sử bạn muốn ghi nhật ký tất cả các lỗi xác nhận hợp lệ, nhưng bạn không muốn dừng xử lý khi bạn gặp phải một lỗi. Bạn có thể cài đặt một trình xử lý lỗi như trong Liệt kê 3.

Liệt kê 3. Một trình xử lý lỗi chỉ ghi lại các lỗi xác nhận hợp lệ không nghiêm trọng
import org.xml.sax.ErrorHandler;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

public class ForgivingErrorHandler implements ErrorHandler {

    public void warning(SAXParseException ex) {
        System.err.println(ex.getMessage());
    }

    public void error(SAXParseException ex) {
        System.err.println(ex.getMessage());
    }

    public void fatalError(SAXParseException ex) throws SAXException {
        throw ex;
    }

}

Để cài đặt trình xử lý lỗi này, bạn tạo một cá thể của nó và chuyển cá thể đó tới phương thức setErrorHandler() của các Validator:

  ErrorHandler lenient = new ForgivingErrorHandler();
  validator.setErrorHandler(lenient);

Tăng thêm lược đồ

Một số lược đồ làm nhiều việc hơn là chỉ xác nhận hợp lệ. Cũng như việc đưa ra một câu trả lời đúng-sai cho câu hỏi liệu một tài liệu đã hợp lệ chưa, chúng cũng làm tăng thêm thông tin bổ sung cho tài liệu. Ví dụ, chúng có thể tạo ra các giá trị thuộc tính mặc định. Chúng cũng có thể gán các kiểu như int hoặc gYear cho một phần tử hoặc thuộc tính. Trình xác nhận hợp lệ có thể tạo ra các tài liệu tăng thêm-kiểu như vậy và viết chúng vào một đối tượng javax.xml.transform.Result. Tất cả mọi thứ mà bạn cần làm là chuyển một Result (kết quả) làm đối số thứ hai để xác nhận hợp lệ. Ví dụ, Liệt kê 4 vừa xác nhận hợp lệ một tài liệu đầu vào và vừa tạo một tài liệu DOM tăng thêm từ việc kết hợp đầu vào với lược đồ.

Liệt kê 4. Tăng thêm một tài liệu với một lược đồ
import java.io.*;
import javax.xml.transform.dom.*;
import javax.xml.validation.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.xml.sax.SAXException;

public class DocbookXSDAugmenter {

    public static void main(String[] args) 
      throws SAXException, IOException, ParserConfigurationException {

        SchemaFactory factory 
         = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
        Validator validator = schema.newValidator();
        
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        domFactory.setNamespaceAware(true); // never forget this
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        Document doc = builder.parse(new File(args[0]));
        
        DOMSource source = new DOMSource(doc);
        DOMResult result = new DOMResult();
        
        try {
            validator.validate(source, result);
            Document augmented = (Document) result.getNode();
            // do whatever you need to do with the augmented document...
        }
        catch (SAXException ex) {
            System.out.println(args[0] + " is not valid because ");
            System.out.println(ex.getMessage());
        }  
        
    }

}

Thủ tục này không thể chuyển đổi một nguồn tùy ý thành một kết quả tùy ý. Nó không hề làm việc với các nguồn và các kết quả dòng dữ liệu. Có thể tăng thêm các nguồn SAX vào các kết quả SAX và các nguồn DOM vào các kết quả DOM; nhưng không thể tăng thêm các nguồn SAX vào các kết quả DOM hoặc ngược lại. Nếu bạn cần làm điều đó, trước tiên hãy tăng thêm vào kết quả phù hợp -- SAX vào SAX và DOM vào DOM -- và sau đó sử dụng phép biến đổi đồng nhất của TRAX để thay đổi mô hình.

Tuy nhiên kỹ thuật này không quan trọng. Việc đưa tất cả thông tin mà tài liệu cần vào trong cá thể còn đáng tin cậy hơn so với việc chia nhỏ thông tin giữa cá thể và lược đồ. Bạn có thể xác nhận hợp lệ, nhưng không phải tất cả mọi người sẽ làm như vậy.


Thông tin kiểu

Ngôn ngữ Lược đồ XML của W3C chủ yếu dựa vào khái niệm về các kiểu. Các phần tử và các thuộc tính được khai báo có kiểu int, double, date (ngày), duration (khoảng thời gian), person (cá nhân), PhoneNumber (số điện thoại), hoặc bất cứ cái gì khác mà bạn có thể tưởng tượng ra. Java Validation API có một phương tiện để cho biết các kiểu như vậy, mặc dù đáng ngạc nhiên là nó độc lập với phần còn lại của gói.

Các kiểu được xác định bằng một đối tượng org.w3c.dom.TypeInfo. Giao diện đơn giản này, được tóm tắt trong Liệt kê 5, cho bạn biết tên cục bộ và URI vùng tên của một kiểu. Bạn cũng có thể cho biết một kiểu có nguồn gốc từ kiểu khác không và gốc gác ra sao. Ngoài ra, sự thỏa thuận về kiểu để cho chương trình của bạn quyết định. Ngôn ngữ Java không cho bạn biết nó có nghĩa gì hay chuyển đổi dữ liệu sang một kiểu Java chẳng hạn như double hoặc java.util.Date.

Liệt kê 5. Giao diện TypeInfo DOM
package org.w3c.dom;

public interface TypeInfo {

  public static final int DERIVATION_RESTRICTION;
  public static final int DERIVATION_EXTENSION;
  public static final int DERIVATION_UNION;

  public String  getTypeName();
  public String  getTypeNamespace()
  public boolean isDerivedFrom(String namespace, String name, int derivationMethod);

}

Để nhận được các đối tượng TypeInfo (Thông tin kiểu), bạn yêu cầu đối tượng Schema với một ValidatorHandler hơn là một Validator. ValidatorHandler thực hiện giao diện ContentHandler của SAX. Sau đó, bạn cài đặt trình xử lý này trong một trình phân tích cú pháp SAX.

Bạn cũng cài đặt ContentHandler riêng của bạn trong ValidatorHandler (không phải là trình phân tích cú pháp); ValidatorHandler sẽ chuyển tiếp các sự kiện tăng thêm tới ContentHandler của bạn.

ValidatorHandler tạo sẵn một TypeInfoProvider để ContentHandler của bạn có thể gọi bất cứ lúc nào để tìm ra kiểu của phần tử hiện tại hoặc một trong các thuộc tính của nó. Nó cũng có thể cho bạn biết liệu một thuộc tính có là một ID không, và liệu thuộc tính đó được xác định rõ ràng trong tài liệu hoặc được định sẵn trong tài liệu của lược đồ không. Liệt kê 6 tóm tắt lớp này.

Liệt kê 6. Lớp TypeInfoProvider
package javax.xml.validation;

public abstract class TypeInfoProvider {

  public abstract TypeInfo getElementTypeInfo();
  public abstract TypeInfo getAttributeTypeInfo(int index);
  public abstract boolean  isIdAttribute(int index);
  public abstract boolean  isSpecified(int index);

}

Cuối cùng, bạn phân tích cú pháp tài liệu bằng XMLReader của SAX. Liệt kê 7 cho thấy một chương trình đơn giản sử dụng tất cả các lớp và các giao diện để in ra các tên của tất cả các kiểu phần tử trong một tài liệu.

Liệt kê 7. Liệt kê các kiểu phần tử
import java.io.*;
import javax.xml.validation.*;

import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class TypeLister extends DefaultHandler {

    private TypeInfoProvider provider;
    
    public TypeLister(TypeInfoProvider provider) {
        this.provider = provider;
    }

    public static void main(String[] args) throws SAXException, IOException {

        SchemaFactory factory 
         = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
        File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
        Schema schema = factory.newSchema(schemaLocation);
    
        ValidatorHandler vHandler = schema.newValidatorHandler();
        TypeInfoProvider provider = vHandler.getTypeInfoProvider();
        ContentHandler   cHandler = new TypeLister(provider);
        vHandler.setContentHandler(cHandler);
        
        XMLReader parser = XMLReaderFactory.createXMLReader();
        parser.setContentHandler(vHandler);
        parser.parse(args[0]);
        
    }
    
    public void startElement(String namespace, String localName,
      String qualifiedName, Attributes atts) throws SAXException {
        String type = provider.getElementTypeInfo().getTypeName();
        System.out.println(qualifiedName + ": " + type);
    }

}

Đây là khởi đầu của kết quả đầu ra từ việc chạy mã này trên một tài liệu DocBook điển hình:

book: #AnonType_book
title: #AnonType_title
subtitle: #AnonType_subtitle
info: #AnonType_info
copyright: #AnonType_copyright
year: #AnonType_year
holder: #AnonType_holder
author: #AnonType_author
personname: #AnonType_personname
firstname: #AnonType_firstname
othername: #AnonType_othername
surname: #AnonType_surname
personblurb: #AnonType_personblurb
para: #AnonType_para
link: #AnonType_link

Như bạn có thể thấy, lược đồ DocBook gán cho hầu hết các kiểu phức tạp ẩn danh của các phần tử. Rõ ràng, điều này sẽ thay đổi từ một lược đồ này sang lược đồ tiếp theo.


Kết luận

Thế giới sẽ trở nên nghèo nàn hơn nếu mọi người chỉ nói một ngôn ngữ. Các nhà lập trình sẽ không hạnh phúc nếu họ chỉ có một ngôn ngữ lập trình để chọn. Các ngôn ngữ khác nhau thích hợp với các nhiệm vụ khác nhau tốt hơn, và một số nhiệm vụ lại đòi hỏi nhiều hơn một ngôn ngữ. Các lược đồ XML không khác nhau. Bạn có thể chọn từ rất nhiều ngôn ngữ lược đồ có ích. Trong Java 5 với javax.xml.validation, bạn có một API có thể xử lý tất cả chúng.

Tài nguyên

Học tập

Lấy sản phẩm và công nghệ

  • DocBook 5.0 được định nghĩa theo quy chuẩn trong RELAX NG. Lược đồ RELAX NG sau đó được biên dịch thành các DTD và các lược đồ W3C cho người dùng, những người cần các ngôn ngữ đó.
  • Tải về JAXP 1.3 cho Java 1.3 và 1.4 từ java.net.
  • Kohsuke Kawaguchi đã viết một tầng bộ chuyển đổi kết nối giao diện JARV cũ được hỗ trợ bởi một số trình xác nhận hợp lệ RELAX NG như JING đến các JAXP API đã mô tả ở đây.
  • Trình phân tích cú pháp XML Xerces hỗ trợ JAXP 1.3, bao gồm API xác nhận được thảo luận trong bài viết này.
  • Phần mềm dùng thử của IBM có sẵn để tải về trực tiếp từ developerWorks.

Thảo luận

Bình luận

developerWorks: Đăng nhập

Các trường được đánh dấu hoa thị là bắt buộc (*).


Bạn cần một ID của IBM?
Bạn quên định danh?


Bạn quên mật khẩu?
Đổi mật khẩu

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Ở lần bạn đăng nhập đầu tiên vào trang developerWorks, một hồ sơ cá nhân của bạn được tạo ra. Thông tin trong bản hồ sơ này (tên bạn, nước/vùng lãnh thổ, và tên cơ quan) sẽ được trưng ra cho mọi người và sẽ đi cùng các nội dung mà bạn đăng, trừ khi bạn chọn việc ẩn tên cơ quan của bạn. Bạn có thể cập nhật tài khoản trên trang IBM bất cứ khi nào.

Thông tin gửi đi được đảm bảo an toàn.

Chọn tên hiển thị của bạn



Lần đầu tiên bạn đăng nhập vào trang developerWorks, một bản trích ngang được tạo ra cho bạn, bạn cần phải chọn một tên để hiển thị. Tên hiển thị của bạn sẽ đi kèm theo các nội dung mà bạn đăng tải trên developerWorks.

Tên hiển thị cần có từ 3 đến 30 ký tự. Tên xuất hiện của bạn phải là duy nhất trên trang Cộng đồng developerWorks và vì lí do an ninh nó không phải là địa chỉ email của bạn.

Các trường được đánh dấu hoa thị là bắt buộc (*).

(Tên hiển thị cần có từ 3 đến 30 ký tự)

Bằng việc nhấn Gửi, bạn đã đồng ý với các điều khoản sử dụng developerWorks Điều khoản sử dụng.

 


Thông tin gửi đi được đảm bảo an toàn.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=70
Zone=Nguồn mở, Công nghệ Java
ArticleID=777361
ArticleTitle=XML Validation API của Java
publish-date=02102010