如何在Java中针对XSD验证XML

时间:2020-02-23 14:36:15  来源:igfitidea点击:

Java XML验证API可用于针对Java程序中的XSD验证XML。
此程序中使用javax.xml.validation.Validator类来针对Java中的xsd验证xml。

针对XSD验证XML

这是使用的示例XSD和XML文件。

Employee.xsd

<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="https://www.w3.org/2001/XMLSchema" 
targetNamespace="https://www.theitroad.local/Employee" 
xmlns:empns="https://www.theitroad.local/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还包含两个根元素和名称空间,我已经使用Eclipse从XSD创建了两个示例XML文件。

EmployeeRequest.xml

<?xml version="1.0" encoding="UTF-8"?>
<empns:empRequest xmlns:empns="https://www.theitroad.local/Employee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.theitroad.local/Employee Employee.xsd ">
<empns:id>5</empns:id>
</empns:empRequest>

EmployeeResponse.xml

<?xml version="1.0" encoding="UTF-8"?>
<empns:empResponse xmlns:empns="https://www.theitroad.local/Employee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.theitroad.local/Employee Employee.xsd ">
<empns:id>1</empns:id>
<empns:role>Developer</empns:role>
<empns:fullName>hyman Kumar</empns:fullName>
</empns:empResponse>

这是另一个未向" Employee.xsd"确认的XML文件。

employee.xml

<?xml version="1.0"?>
<Employee>
	<name>hyman</name>
	<age>29</age>
	<role>Java Developer</role>
	<gender>Male</gender>
</Employee>

这是用于针对XSD验证所有三个XML文件的程序。
validateXMLSchema方法将XSD和XML文件作为参数,如果验证成功,则返回true,否则返回false。

XMLValidation.java

package com.theitroad.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

使用Java XML验证API的好处是我们不需要解析文件,并且不使用任何第三方API。