Validate Xml

根据自己理解写的。
写完之后发现有注释更为详细的,地址为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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值