该javax.xml.validation软件包提供了用于XML文档验证的API。验证过程将验证XML文档是指定的XML模式文件或XSD文件的实例。在此示例中,我们将验证records.xml下面的文件是否在records.xsd架构实例中。首先,我们将创建以下XML文件和应遵循的XSD文件。
XML文件:<?xml version="1.0" encoding="UTF-8"?>
Brand New EyesParamore
Punk Rock
2011
Various Artist
Rock
XSD文件:<?xml version="1.0" encoding="UTF-8"?>
elementFormDefault="qualified">
下面的代码段将在以下步骤中处理验证过程。在main()方法中,我们创建XMLValidator实例并调用该validate()方法,并传递XML文件和XSD文件。我们的validate()方法首先创建的实例SchemaFactory。该SchemaFactory.newInstance()方法返回的实例SchemaFactory。在此示例中,我们将创建一个W3C XML模式。
下一步是Schema通过调用schemaFactory.newSchema()并创建一个对象,然后传递模式/ XSD文件。该Schema对象将允许我们javax.xml.validation.Validator通过调用schema.newValidator()方法来创建的实例。最后,为了验证XML是否有效,我们调用validator.validate()方法并传递要验证的XML文件。如果XML无效,则此validate方法将引发异常。
Java代码:package org.nhooo.example.xml;
import org.xml.sax.SAXException;
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 java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URL;
import java.util.Objects;
public class XMLValidator {
public static final String XML_FILE = "records.xml";
public static final String SCHEMA_FILE = "records.xsd";
public static void main(String[] args) {
XMLValidator XMLValidator = new XMLValidator();
boolean valid = XMLValidator.validate(XML_FILE, SCHEMA_FILE);
System.out.printf("%s validation = %b.", XML_FILE, valid);
}
private boolean validate(String xmlFile, String schemaFile) {
SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
try {
Schema schema = schemaFactory.newSchema(new File(getResource(schemaFile)));
Validator validator = schema.newValidator();
validator.validate(new StreamSource(new File(getResource(xmlFile))));
return true;
} catch (SAXException | IOException e) {
e.printStackTrace();
return false;
}
}
private String getResource(String filename) throws FileNotFoundException {
URL resource = getClass().getClassLoader().getResource(filename);
Objects.requireNonNull(resource);
return resource.getFile();
}
}