Java XML校驗API可以通過XSD(XML Schema Definition)校驗XML文件內容的合法性。
在以下的案例中使用javax.xml.validation.Validator 類通過一個xsd文件來鑒定XML內容合法性。
以下是我們將要用於校驗的xsd文件和xml文件的內容。
Employee.xsd
<?
xml version="1.0" encoding="UTF-8"?> <schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.journaldev.com/Employee" xmlns:empns="http://www.journaldev.com/Employee" elementFormDefault="qualified"> <element name="empRequest" type="empns:empRequest"></element> <element name="empResponse" type="empns:empResponse"></element> <complexType name="empRequest"> <sequence> <element name="id" type="int"></element> </sequence> </complexType> <complexType name="empResponse"> <sequence> <element name="id" type="int"></element> <element name="role" type="string"></element> <element name="fullName" type="string"></element> </sequence> </complexType> </schema>
須要注意的是上面的XSD包括兩種根元素。同一時候具有命名空間,以下兩種xml文件內容都是合法的:
EmployeeRequest.xml
<?xml version="1.0" encoding="UTF-8"?>
<empns:empRequest xmlns:empns="http://www.journaldev.com/Employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.journaldev.com/Employee Employee.xsd ">
<empns:id>5</empns:id>
</empns:empRequest>
EmployeeResponse.xml
<?xml version="1.0" encoding="UTF-8"?>
<empns:empResponse xmlns:empns="http://www.journaldev.com/Employee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.journaldev.com/Employee Employee.xsd ">
<empns:id>1</empns:id>
<empns:role>Developer</empns:role>
<empns:fullName>Pankaj Kumar</empns:fullName>
</empns:empResponse>
以下的一個xml文件內容是不滿足XSD約束的:
employee.xml
<?xml version="1.0"?
> <Employee> <name>Pankaj</name> <age>29</age> <role>Java Developer</role> <gender>Male</gender> </Employee>
接下來看怎樣通過程序來校驗這三個xml文件內容是否滿足XSD的約束,validateXMLSchema方法接受兩個參數,各自是xsd和xml文件的路徑,假設xml文件內容是合法的,該方法返回true,否則返回false。
XMLValidation.java
package com.journaldev.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.XMLConstants;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.xml.sax.SAXException;
public class XMLValidation {
public static void main(String[] args) {
System.out.println("EmployeeRequest.xml validates against Employee.xsd? "+validateXMLSchema("Employee.xsd", "EmployeeRequest.xml")); System.out.println("EmployeeResponse.xml validates against Employee.xsd?
"+validateXMLSchema("Employee.xsd", "EmployeeResponse.xml")); System.out.println("employee.xml validates against Employee.xsd?
"+validateXMLSchema("Employee.xsd", "employee.xml")); } public static boolean validateXMLSchema(String xsdPath, String xmlPath){ try { SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(new File(xsdPath)); Validator validator = schema.newValidator(); validator.validate(new StreamSource(new File(xmlPath))); } catch (IOException | SAXException e) { System.out.println("Exception: "+e.getMessage()); return false; } return true; } }
執行上面程序。控制台輸出:
EmployeeRequest.xml validates against Employee.xsd? true EmployeeResponse.xml validates against Employee.xsd?
true Exception: cvc-elt.1: Cannot find the declaration of element 'Employee'. employee.xml validates against Employee.xsd? false