如何用 Java 根据 XSD 验证 XML

Java XML 验证 API 可用于在 Java 程序中对 XML 进行 XSD 验证。 javax.xml.validation.Validator 类用于在 Java 中对 xml 进行 xsd 验证。

验证 XML 对 XSD

Validate XML against XSD java, java xml validation, xsd validator java Here are the sample XSD and XML files used. Employee.xsd

 1<?xml version="1.0" encoding="UTF-8"?>
 2<schema xmlns="https://www.w3.org/2001/XMLSchema" 
 3targetNamespace="https://www.journaldev.com/Employee" 
 4xmlns:empns="https://www.journaldev.com/Employee" elementFormDefault="qualified">
 5
 6    <element name="empRequest" type="empns:empRequest"></element>
 7    
 8    <element name="empResponse" type="empns:empResponse"></element>
 9
10    <complexType name="empRequest">
11    	<sequence>
12    		<element name="id" type="int"></element>
13    	</sequence>
14    </complexType>
15    
16    <complexType name="empResponse">
17    	<sequence>
18    		<element name="id" type="int"></element>
19    		<element name="role" type="string"></element>
20    		<element name="fullName" type="string"></element>
21    	</sequence>
22    </complexType>
23</schema>

请注意,上面XSD包含两个根元素和名称空间,我也创建了两个样本(使用Eclipse使用XSD的XML文件)(/community/tutorials/generate-xml-xsd-eclipse-java)。

1<?xml version="1.0" encoding="UTF-8"?>
2<empns:empRequest xmlns:empns="https://www.journaldev.com/Employee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.journaldev.com/Employee Employee.xsd ">
3  <empns:id>5</empns:id>
4</empns:empRequest>

员工响应.xml

1<?xml version="1.0" encoding="UTF-8"?>
2<empns:empResponse xmlns:empns="https://www.journaldev.com/Employee" xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://www.journaldev.com/Employee Employee.xsd ">
3  <empns:id>1</empns:id>
4  <empns:role>Developer</empns:role>
5  <empns:fullName>Pankaj Kumar</empns:fullName>
6</empns:empResponse>

下面是另一个 XML 文件,没有确认到Employee.xsd

1<?xml version="1.0"?>
2<Employee>
3    <name>Pankaj</name>
4    <age>29</age>
5    <role>Java Developer</role>
6    <gender>Male</gender>
7</Employee>

以下是用于对XSD的所有三个XML文件进行验证的程序。通过validateXMLSchema方法将XSD和XML文件作为参数并返回 true,如果验证成功或返回 false

 1package com.journaldev.xml;
 2
 3import java.io.File;
 4import java.io.IOException;
 5
 6import javax.xml.XMLConstants;
 7import javax.xml.transform.stream.StreamSource;
 8import javax.xml.validation.Schema;
 9import javax.xml.validation.SchemaFactory;
10import javax.xml.validation.Validator;
11
12import org.xml.sax.SAXException;
13
14public class XMLValidation {
15
16    public static void main(String[] args) {
17
18      System.out.println("EmployeeRequest.xml validates against Employee.xsd? "+validateXMLSchema("Employee.xsd", "EmployeeRequest.xml"));
19      System.out.println("EmployeeResponse.xml validates against Employee.xsd? "+validateXMLSchema("Employee.xsd", "EmployeeResponse.xml"));
20      System.out.println("employee.xml validates against Employee.xsd? "+validateXMLSchema("Employee.xsd", "employee.xml"));
21
22      }
23
24    public static boolean validateXMLSchema(String xsdPath, String xmlPath){
25
26        try {
27            SchemaFactory factory = 
28                    SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
29            Schema schema = factory.newSchema(new File(xsdPath));
30            Validator validator = schema.newValidator();
31            validator.validate(new StreamSource(new File(xmlPath)));
32        } catch (IOException | SAXException e) {
33            System.out.println("Exception: "+e.getMessage());
34            return false;
35        }
36        return true;
37    }
38}

上述方案的结果是:

1EmployeeRequest.xml validates against Employee.xsd? true
2EmployeeResponse.xml validates against Employee.xsd? true
3Exception: cvc-elt.1: Cannot find the declaration of element 'Employee'.
4employee.xml validates against Employee.xsd? false

使用Java XML验证API的好处在于,我们不需要对文件进行解析,并且没有使用第三方API。

Published At
Categories with 技术
Tagged with
comments powered by Disqus