Javat通过XML Schema 校验XML文件

XML的校验在XML处理中非常常见,如果没有有效的办法来校验XML的合法性,往往会导致很多问题。

XML的校验是通过XML Schema(XSD) 的语法规范来校验的。

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;

import com.cmdi.wmttool.dto.XmlValidateResult;

/**
 * 
 * @Title: VerifyXML.java
 * @Copyright: Copyright (c) 2016
 * @author you.xu
 * @date 2016年3月10日上午9:36:20
 * @version 1.0
 */
public class XmlValidator {

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

    /**
     * @param xmlStr
     * @param xsdStr
     * @return XmlValidateResult 通过Schema验证指定的xml字符串是否符合结构
     */
    public static XmlValidateResult validateByXsd(String xmlStr, String xsdStr) {
        // 查找支持指定模式语言的 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 = 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("D:/schema.xml");
        File xsd = new File("D:/schema.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("验证成功!");
            System.out.println("验证xml:" + xml);
        } else {
            System.out.println("验证失败!");
            System.out.println("失败原因:" + vs.getErrorMsg());
            System.out.println("验证xml:" + xml + "\n" + xmlStr.toString());
        }
    }
}

实体类对象:

package com.cmdi.wmttool.dto;

/**
 * 
 * @Title: XmlValidateResult.java
 * @Copyright: Copyright (c) 2016
 * @author you.xu
 * @date 2016年3月10日上午9:37:33
 * @version 1.0
 */
public class XmlValidateResult {

    // 是否通过验证
    private boolean validated;

    // 错误信息
    private String errorMsg;

    // 构造函数,默认为不通过,错误原因为空字符串
    public 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;
    }
}

原文地址:http://ufopw.iteye.com/blog/767249

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值