利用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;
}
}
}