原文:http://blog.chinaunix.net/space.php?uid=276853&do=blog&id=366491
关于XML的验证一点实践
1)此方法是在XML文档中绑定对应的DTD文件来进行的
//部分程序代码如下:
//为解析XML作准备,创建DocumentBuilderFactory实例,指定DocumentBuilder
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setValidating(true);//设置验证有效
MyHandler handler = new MyHandler();//处理验证的类,具体在下
DocumentBuilder db = dbf.newDocumentBuilder();
db.setErrorHandler(handler);
Document doc = null;
doc = db.parse(new File(filename));//要验证的XML文件放入验证
if (handler.errorMessage == null) {
System.out.println("XML文件是有效的");
}
else {
System.out.println("XML文件不是有效的");
return false;
}
class MyHandler extends DefaultHandler {
String errorMessage = null;
public void error(SAXParseException e) throws SAXException {
errorMessage = e.getMessage();
System.out.println("一般错误:" + errorMessage);
}
public void fatalError(SAXParseException e) throws SAXException {
errorMessage = e.getMessage();
System.out.println("致命错误:" + errorMessage);
}
}
说明: XML文档中若根元素含有属性如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Apply SYSTEM "e:/gzwl/transport/hpdi_exmnl_exch/Apply.dtd">//dtd路径设置
<Apply xmlns="un:hpedi_ex_mnl">//属性名为xmlns
<AppInfo>…..
则在DTD中要增加设置为:
<!ELEMENT Apply (AppInfo?, ImpList?, ExpList?)>//这是某根元素含列表
<!ATTLIST Apply xmlns CDATA #REQUIRED>//这个才是根元素属性设置
2)另外方法是:采用DOM4J来做,就不需要在具体XML文件中绑定XSD模式文件了。(推荐)
先当然是要添加Dom4j.jar包到项目路径中,再在具体java文件中import相关类
其中XSD验证部分代码如下:
XMLErrorHandler errorHandler = new XMLErrorHandler();
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setValidating(true);//注意要设置有效,否则后面验证无用
factory.setNamespaceAware(true);//XSD中有命名空间设置
SAXParser parser = factory.newSAXParser();
SAXReader xmlReader = new SAXReader();
Document documentObject = (Document) xmlReader.read(new File(filename));//filename是对应符合XSD模式的具体xml文件绝对路径名
String xsdpathfile = "e:\\schemaexample\\example.xsd";//xsdPathfile是绝对路径名
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage",
"http://www.w3.org/2001/XMLSchema");
parser.setProperty("http://java.sun.com/xml/jaxp/properties/schemaSource","file:" + xsdpathfile);
SAXValidator validator = new SAXValidator(parser.getXMLReader());
validator.setErrorHandler(errorHandler);
validator.validate(documentObject);
XMLWriter writer = new XMLWriter(OutputFormat.createPrettyPrint());
if (errorHandler.getErrors().hasContent()) {
writer.write(errorHandler.getErrors());
return false;
} else {
System.out.println("validate success.");
return true;
}