根据自己理解写的。
写完之后发现有注释更为详细的,地址为http://blog.csdn.net/fenglibing/article/details/4150642
利用XMLReader的parse方法来validate。
需要设定XMLReader的ContentHandler(内容处理器)
ContentHandler采用sun的msv方式
简化流程为:
得到XMLReader实例
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
XMLReader [color=red]reader [/color]= parserFactory.newSAXParser().getXMLReader();
得到校验者verifier
VerifierFactory factory = new com.sun.msv.verifier.jarv.TheFactoryImpl();
Verifier [color=red]verifier [/color]= factory.newVerifier(fileSchema);
设定reader的内容处理器ContentHandler
[color=red]reader.setContentHandler(verifier.getVerifierHandler());[/color]
解析xml
[color=red]reader.parse[/color](new InputSource(new StringReader(xmlSource)));
以下为源码。
package com.bull.iris.portal.common;
import java.io.File;
import java.io.InputStream;
import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import org.apache.log4j.Logger;
import org.iso_relax.verifier.Verifier;
import org.iso_relax.verifier.VerifierFactory;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import com.sun.msv.verifier.jarv.TheFactoryImpl;
public class ValidateXml {
private static Logger logger = org.apache.log4j.Logger.getLogger(ValidateXml.class);
public static boolean validate(String xmlSource, File fileSchema) {
logger.debug("enter ValidateXml class");
//if schema file is null, then return;
if (fileSchema == null) {
logger.debug("file not found");
return false;
}
logger.debug("enter ValidateXml class step 1");
try {
VerifierFactory factory = new TheFactoryImpl();
Verifier verifier = factory.newVerifier(fileSchema);
logger.debug("enter ValidateXml class step 2");
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
XMLReader reader = parserFactory.newSAXParser().getXMLReader();
reader.setContentHandler(verifier.getVerifierHandler());
logger.debug("enter ValidateXml class step 3");
//实现自己的错误处理。不写也可。有默认实现。
verifier.setErrorHandler(new ErrorHandler() {
public void error(SAXParseException e) {
e.printStackTrace();
logger.debug("error 1" + e.getMessage());
throw new RecieveValidationException(e.getLineNumber(), e
.getMessage());
}
public void fatalError(SAXParseException e) {
e.printStackTrace();
logger.debug("error 2" + e.getMessage());
throw new RecieveValidationException(e.getLineNumber(), e
.getMessage());
}
public void warning(SAXParseException e) {
e.printStackTrace();
logger.debug("error 3" + e.getMessage());
}
});
logger.debug("enter ValidateXml class step 4");
reader.parse(new InputSource(new StringReader(xmlSource)));
logger.debug("enter ValidateXml class step 5");
} catch (RecieveValidationException e) {
e.printStackTrace();
logger.debug("error 4" + e.getMessage());
//throw e;
return false;
} catch (Exception e) {
e.printStackTrace();
logger.debug("error 5" + e.getMessage());
//throw new RuntimeException(e);
return false;
}
return true;
}
写完之后发现有注释更为详细的,地址为http://blog.csdn.net/fenglibing/article/details/4150642
利用XMLReader的parse方法来validate。
需要设定XMLReader的ContentHandler(内容处理器)
ContentHandler采用sun的msv方式
简化流程为:
得到XMLReader实例
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
XMLReader [color=red]reader [/color]= parserFactory.newSAXParser().getXMLReader();
得到校验者verifier
VerifierFactory factory = new com.sun.msv.verifier.jarv.TheFactoryImpl();
Verifier [color=red]verifier [/color]= factory.newVerifier(fileSchema);
设定reader的内容处理器ContentHandler
[color=red]reader.setContentHandler(verifier.getVerifierHandler());[/color]
解析xml
[color=red]reader.parse[/color](new InputSource(new StringReader(xmlSource)));
以下为源码。
package com.bull.iris.portal.common;
import java.io.File;
import java.io.InputStream;
import java.io.StringReader;
import javax.xml.parsers.SAXParserFactory;
import org.apache.log4j.Logger;
import org.iso_relax.verifier.Verifier;
import org.iso_relax.verifier.VerifierFactory;
import org.xml.sax.ErrorHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import com.sun.msv.verifier.jarv.TheFactoryImpl;
public class ValidateXml {
private static Logger logger = org.apache.log4j.Logger.getLogger(ValidateXml.class);
public static boolean validate(String xmlSource, File fileSchema) {
logger.debug("enter ValidateXml class");
//if schema file is null, then return;
if (fileSchema == null) {
logger.debug("file not found");
return false;
}
logger.debug("enter ValidateXml class step 1");
try {
VerifierFactory factory = new TheFactoryImpl();
Verifier verifier = factory.newVerifier(fileSchema);
logger.debug("enter ValidateXml class step 2");
SAXParserFactory parserFactory = SAXParserFactory.newInstance();
parserFactory.setNamespaceAware(true);
XMLReader reader = parserFactory.newSAXParser().getXMLReader();
reader.setContentHandler(verifier.getVerifierHandler());
logger.debug("enter ValidateXml class step 3");
//实现自己的错误处理。不写也可。有默认实现。
verifier.setErrorHandler(new ErrorHandler() {
public void error(SAXParseException e) {
e.printStackTrace();
logger.debug("error 1" + e.getMessage());
throw new RecieveValidationException(e.getLineNumber(), e
.getMessage());
}
public void fatalError(SAXParseException e) {
e.printStackTrace();
logger.debug("error 2" + e.getMessage());
throw new RecieveValidationException(e.getLineNumber(), e
.getMessage());
}
public void warning(SAXParseException e) {
e.printStackTrace();
logger.debug("error 3" + e.getMessage());
}
});
logger.debug("enter ValidateXml class step 4");
reader.parse(new InputSource(new StringReader(xmlSource)));
logger.debug("enter ValidateXml class step 5");
} catch (RecieveValidationException e) {
e.printStackTrace();
logger.debug("error 4" + e.getMessage());
//throw e;
return false;
} catch (Exception e) {
e.printStackTrace();
logger.debug("error 5" + e.getMessage());
//throw new RuntimeException(e);
return false;
}
return true;
}