import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.xml.XMLConstants;
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.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXValidator;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.XMLErrorHandler;
import org.xml.sax.SAXException;
import com.ufgov.bank.common.log.*;
public class validateXml {
private static final SimpleDateFormat sdf2 = new SimpleDateFormat(
"yyyyMMddHHmmssSSS");
public boolean validate(String xsdUrl, String xml) throws Exception {
Date date = new Date();
LogOperation.writeLog("client","xsd文件路径:"+xsdUrl,sdf2.format(date));
LogOperation.writeLog("client","xsd校验前的xml:"+xml,sdf2.format(date));
// 获取Schema工厂类
// 这里的XMLConstants.W3C_XML_SCHEMA_NS_URI的值就是://http://www.w3.org/2001/XMLSchema
SchemaFactory factory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
// 获取XSD文件,以流的方式读取到Source中
// XSD文件的位置相对于类文件位置
Source schemaSource = new StreamSource(new FileInputStream(xsdUrl));
Schema schema = factory.newSchema(schemaSource);
// 这里是将一个DOM树对象转换成流对象,以便对DOM树对象验证
// 如果是对XML文件进行验证,用FileInputStream即可
ByteArrayInputStream bais = new ByteArrayInputStream(
xml.getBytes("GBK"));
// 获取验证器,验证器的XML Schema源就是之前创建的Schema
Validator validator = schema.newValidator();
XMLErrorHandler errorHandler = new XMLErrorHandler();
validator.setErrorHandler(errorHandler);
Source source = new StreamSource(bais);
// 执行验证
try {
validator.validate(source);
if (errorHandler.getErrors().hasContent()) {
List errorlist = errorHandler.getErrors().selectNodes("error");
for (int i = 0; i < errorlist.size(); i++) {
String errorMsg = getErrorMsg(xsdUrl,
(Element) errorlist.get(i));
if (errorMsg != null) {
System.out.println(errorMsg);
LogOperation.writeLog("client",errorMsg,sdf2.format(date));
}
}
return false;
} else {
return true;
}
} catch (Exception ex) {
ex.printStackTrace();
//throw ex;
return false;
} finally {
bais.close();
}
}
private static String getErrorMsg(String path, Element errorElement)
throws Exception {
String errorContent = errorElement.getText();
String attribute = "attribute '";
String strAttrib = "";
if (errorContent.toLowerCase().indexOf("'data'") >= 0) {
strAttrib = "dataAttribute";
} else if (errorContent.toLowerCase().indexOf("'row'") >= 0) {
strAttrib = "rowAttribute";
}
if (errorContent.toLowerCase().indexOf(attribute) >= 0) {
String tempContent = errorContent.substring(errorContent
.toLowerCase().indexOf(attribute) + attribute.length());
String attributeName = tempContent.substring( 0,
tempContent.indexOf("'"));
Document document = TextReader.ReadXmlFile(new File(path));
String errorPath = "xs:attributeGroup[@name='" + strAttrib + "']/"
+ "xs:attribute[@name='" + attributeName + "']/@id";
Node errorNode = document.getRootElement().selectSingleNode(
errorPath);
return errorNode.getText()+":["+errorContent+"]";
}
return null;
}
}
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.StringWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.xml.XMLConstants;
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.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXValidator;
import org.dom4j.io.XMLWriter;
import org.dom4j.util.XMLErrorHandler;
import org.xml.sax.SAXException;
import com.ufgov.bank.common.log.*;
public class validateXml {
private static final SimpleDateFormat sdf2 = new SimpleDateFormat(
"yyyyMMddHHmmssSSS");
public boolean validate(String xsdUrl, String xml) throws Exception {
Date date = new Date();
LogOperation.writeLog("client","xsd文件路径:"+xsdUrl,sdf2.format(date));
LogOperation.writeLog("client","xsd校验前的xml:"+xml,sdf2.format(date));
SchemaFactory factory = SchemaFactory
.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
Source schemaSource = new StreamSource(new FileInputStream(xsdUrl));
Schema schema = factory.newSchema(schemaSource);
ByteArrayInputStream bais = new ByteArrayInputStream(
xml.getBytes("GBK"));
Validator validator = schema.newValidator();
XMLErrorHandler errorHandler = new XMLErrorHandler();
validator.setErrorHandler(errorHandler);
Source source = new StreamSource(bais);
try {
validator.validate(source);
if (errorHandler.getErrors().hasContent()) {
List errorlist = errorHandler.getErrors().selectNodes("error");
for (int i = 0; i < errorlist.size(); i++) {
String errorMsg = getErrorMsg(xsdUrl,
(Element) errorlist.get(i));
if (errorMsg != null) {
System.out.println(errorMsg);
LogOperation.writeLog("client",errorMsg,sdf2.format(date));
}
}
return false;
} else {
return true;
}
} catch (Exception ex) {
ex.printStackTrace();
return false;
} finally {
bais.close();
}
}
private static String getErrorMsg(String path, Element errorElement)
throws Exception {
String errorContent = errorElement.getText();
String attribute = "attribute '";
String strAttrib = "";
if (errorContent.toLowerCase().indexOf("'data'") >= 0) {
strAttrib = "dataAttribute";
} else if (errorContent.toLowerCase().indexOf("'row'") >= 0) {
strAttrib = "rowAttribute";
}
if (errorContent.toLowerCase().indexOf(attribute) >= 0) {
String tempContent = errorContent.substring(errorContent
.toLowerCase().indexOf(attribute) + attribute.length());
String attributeName = tempContent.substring( 0,
tempContent.indexOf("'"));
Document document = TextReader.ReadXmlFile(new File(path));
String errorPath = "xs:attributeGroup[@name='" + strAttrib + "']/"
+ "xs:attribute[@name='" + attributeName + "']/@id";
Node errorNode = document.getRootElement().selectSingleNode(
errorPath);
return errorNode.getText()+":["+errorContent+"]";
}
return null;
}
}