ITPub博客

首页 > 应用开发 > IT综合 > JAVA - 通过SCHEMA验证XML

JAVA - 通过SCHEMA验证XML

原创 IT综合 作者:exigen 时间:2011-10-08 13:34:56 0 删除 编辑

现在基于webservice的接口越来越多,xml格式成为最通用的传输格式,以下代码是通过Schema验证xml格式的示例:

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

声明XML Schema实例名称空间(http://www.w3.org/2001/XMLSchema-instance),并将xsi前缀与该名称空间绑定,这样模式处理器就可以识别xsi:schemaLocation属性。XML Schema实例名称空间的前缀通常使用xsi。

xsi:schemaLocation="http://www.sunxin.org/book http://www.sunxin.org/ book.xsd">

使用xsi:schemaLocation属性指定名称空间http://www.sunxin.org/book和模式位置http://www.sunxin.org/book.xsd相关。要注意,在这个例子中,book.xsd中声明的目标名称空间要求是http://www.sunxin.org/book。

实际上,xsi:schemaLocation属性的值也可以由多个URI引用对组成,每个URI引用对之间使用空白符分隔。

[@more@]
  • XmlValidator工具类:
package verify.xml;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

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.xml.sax.SAXException;

/**
* 验证XML是否符合指定的Schema格式
* @author Peng Wei
*/
public class XmlValidator {

public final static String SCHEMA_LANGUAGE = "http://www.w3.org/2001/XMLSchema";

/**
* 通过Schema验证指定的xml字符串是否符合结构
* @param xmlStr
* @param xsdStr
* @return XmlValidateResult
*/
public static XmlValidateResult validateByXsd(String xmlStr, String xsdStr) {

// 查找支持指定Schema语言的 SchemaFactory的实现并返回它
SchemaFactory factory = SchemaFactory.newInstance(XmlValidator.SCHEMA_LANGUAGE);
// 包装待验证的xml字符串为Reader
Reader xmlReader = new BufferedReader(new StringReader(xmlStr));
// 保障Schema xsd字符串为Reader
Reader xsdReader = new BufferedReader(new StringReader(xsdStr));
// 创建返回值类,默认为失败
XmlValidateResult vs = new XmlValidateResult();

try {
// 构造Schema Source
Source xsdSource = new StreamSource(xsdReader);
// 解析作为Schema的指定源并以Schema形式返回它
Schema schema = factory.newSchema(xsdSource);

// 根据Schema检查xml文档的处理器,创建此 Schema的新 Validator
Validator validator = schema.newValidator();

// 构造待验证xml Source
Source xmlSource = new StreamSource(xmlReader);

// 执行验证
validator.validate(xmlSource);
// 设置验证通过
vs.setValidated(true);
return vs;
} catch (SAXException ex) {
// 设置验证失败
vs.setValidated(false);
// 设置验证失败信息
vs.setErrorMsg(ex.getMessage());
return vs;
} catch (IOException e) {
// 设置验证失败
vs.setValidated(false);
// 设置验证失败信息
vs.setErrorMsg(e.getMessage());
return vs;
}
}

/**
* @param args0
* @throws IOException
*/
public static void main(String[] args0) throws IOException {
File xml = new File("E:WorkSpaceTestsrcverifyxmltest.xml");
File xsd = new File("E:WorkSpaceTestsrcverifyxmlTestSchema.xsd");

BufferedReader xmlBuff = new BufferedReader(new FileReader(xml));
BufferedReader xsdBuff = new BufferedReader(new FileReader(xsd));

StringBuffer xmlStr = new StringBuffer();
String line = null;
while ((line = xmlBuff.readLine()) != null) {
xmlStr.append(line);
xmlStr.append("n");
}
xmlBuff.close();

StringBuffer xsdStr = new StringBuffer();
line = null;
while ((line = xsdBuff.readLine()) != null) {
xsdStr.append(line);
}
xsdBuff.close();

XmlValidateResult vs = XmlValidator.validateByXsd(xmlStr.toString(), xsdStr.toString());
if (vs.isValidated()) {
System.out.println("验证成功!");
} else {
System.out.println("验证失败!");
System.out.println("失败原因:" + vs.getErrorMsg());
System.out.println("验证xml:n" + xmlStr.toString());
}

}
}

  • 验证结果类:

package verify.xml;

/**
* XML验证结果Bean
* @author Peng Wei
*/
public class XmlValidateResult {

// 是否通过验证
private boolean validated;
// 错误信息
private String errorMsg;
// 构造函数,默认为不通过,错误原因为空字符串
XmlValidateResult() {
validated = false;
errorMsg = "";
}

public String getErrorMsg() {
return errorMsg;
}

public void setErrorMsg(String errorMsg) {
this.errorMsg = errorMsg;
}

public boolean isValidated() {
return validated;
}

public void setValidated(boolean validated) {
this.validated = validated;
}

}

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25969737/viewspace-1055500/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2011-06-21

  • 博文量
    13
  • 访问量
    25026