利用jdk自身的javax.xml.validation.Schema特性实现对象xsd对xml的校验,参考代码如下:
package xxx.common.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Path;
import javax.xml.transform.Source;
import javax.xml.transform.stream.StreamSource;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;
import javax.xml.validation.Validator;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* XML校验器
*
* @author 许畅
* @since JDK1.7
* @version 2019年4月16日 许畅 新建
*/
public class XmlValidator {
/** XML schema */
private static final String XML_SCHEMA = "http://www.w3.org/2001/XMLSchema";
/** 日志记录 */
private static final Logger LOGGER = LoggerFactory.getLogger(XmlValidator.class);
/** xsd约束 */
private File xsd;
/** 需要校验的xml */
private File xml;
/**
* 构造方法
*
* @param xsd xsd约束文件
* @param xml 需要校验的xml
*/
public XmlValidator(File xsd, File xml) {
setXsd(xsd);
setXml(xml);
}
/**
* 构造方法
*
* @param xsd xsd约束文件
* @param xml 需要校验的xml
*/
public XmlValidator(Path xsd, Path xml) {
setXsd(xsd.toFile());
setXml(xml.toFile());
}
/**
* 根据xsd校验xml
*
* @return 校验结果集
*/
public ValidateResult<String> validate() {
ValidateResult<String> result = new ValidateResult<String>();
FileInputStream fileInputStream = null;
try {
// 建立schema工厂
SchemaFactory schemaFactory = SchemaFactory.newInstance(XML_SCHEMA);
// 利用schema工厂,接收验证文档文件对象生成Schema对象
Schema schema = schemaFactory.newSchema(xsd);
// 通过Schema产生针对于此Schema的验证器,利用schenaFile进行验证
Validator validator = schema.newValidator();
// 得到验证的数据源
fileInputStream = new FileInputStream(xml);
Source source = new StreamSource(fileInputStream);
// 开始验证,成功输出success!!!,失败输出fail
validator.validate(source);
} catch (Exception e) {
result.setSuccess(false);
String errorMsg = xml.getName() + "校验不通过,请检查【" + xsd.getName() + "】详细约束规则:" + e.getMessage();
result.setResult(errorMsg);
LOGGER.error(errorMsg, e);
} finally {
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
LOGGER.error(e.getMessage(), e);
}
}
}
return result;
}
/**
* @return 获取 xsd属性值
*/
public File getXsd() {
return xsd;
}
/**
* @param xsd 设置 xsd 属性值为参数值 xsd
*/
public void setXsd(File xsd) {
this.xsd = xsd;
}
/**
* @return 获取 xml属性值
*/
public File getXml() {
return xml;
}
/**
* @param xml 设置 xml 属性值为参数值 xml
*/
public void setXml(File xml) {
this.xml = xml;
}
/**
* 校验结果集
*
* @author 许畅
* @since JDK1.7
* @version 2019年4月16日 许畅 新建
* @param <T> 结果集泛型
*/
public class ValidateResult<T> {
/**
* 构造方法
*/
public ValidateResult() {
this.success = true;
}
/** 是否校验成功 */
private boolean success;
/** 结果集 */
private T result;
/**
* @return 获取 success属性值
*/
public boolean isSuccess() {
return success;
}
/**
* @param success 设置 success 属性值为参数值 success
*/
public void setSuccess(boolean success) {
this.success = success;
}
/**
* @return 获取 result属性值
*/
public T getResult() {
return result;
}
/**
* @param result 设置 result 属性值为参数值 result
*/
public void setResult(T result) {
this.result = result;
}
}
}