如何在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。