文档章节

Java基于Schema验证xml

hefeiuu
 hefeiuu
发布于 2017/05/04 20:29
字数 551
阅读 11
收藏 0
现在基于webservice的接口越来越多,xml格式成为最通用的传输格式,以下代码是通过Schema验证xml格式的示例:
一、XmlValidator工具类
package com.starit.comm.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;

/**
 * @author wpan 2010-09-12 验证xml是否符合格式
 * 
 */
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:/order.xml");
		File xsd = new File("D:/order.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 com.starit.comm.xml;

/**
 * @author wpan Xml验证结果
 */
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;
	}

}

说明:其中xml和xsd均是通过字符串作为参数,可以改造为适合自己场景的格式。

本文转载自:http://ufopw.iteye.com/blog/767249

共有 人打赏支持
hefeiuu
粉丝 3
博文 64
码字总数 0
作品 0
合肥
私信 提问
使用 JAXB 框架定制 Web 服务行为

Web 服务概述 从本质上来讲 Web 服务就是对外暴露的并能够通过 Web 进行调用的一组 API,它并不要求服务提供方及调用方的技术实现、编程语言、运行平台甚至操作系统等。也正因为这个特点 We...

红薯
2010/03/24
1K
1
Java 中的 XML: 数据绑定,第 1 部分:代码生成方法 — JAXB 及其它

企业 Java 专家 Dennis Sosnoski 研究了几种 XML 数据绑定方法,这些方法根据用于 XML 文档的 W3C XML Schema 或 DTD 文法来生成代码。他从人们期待已久的 JAXB 标准(马上就要由 Java Commu...

JavaGG
2009/05/22
1K
0
JAXB 应用指南

文章转自:http://blog.csdn.net/darxin/article/details/4845820 JAXB(Java Architecture for XML Binding)是一种特殊的序列化/反序列化工具。它可以使XML数据以Java Objects的形式直接应...

红薯
2011/08/06
4.7K
0
Java SAX tutorial

Java SAX tutorial shows how to use Java SAX API to read and validate XML documents. SAX SAX (Simple API for XML) is an event-driven algorithm for parsing XML documents. SAX is a......

HelloRookie
2018/09/12
0
0
jetty9.1.4配置jndi数据源的方法

环境:j操作系统win7、jetty9.1.4 、jdk1.7、项目是spring mvc、数据库是mysql。 我使用的(前提是在安装好了jetty9.x服务器的基础上)配置步骤: 第一:在你的项目的WEB-INF/目录下新建一个...

java_T
2014/04/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周三乱弹 —— 风扇写着先生请自爱

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @蚂蚁哈哈哈 :分享陈奕迅的单曲《落花流水》 《落花流水》- 陈奕迅 手机党少年们想听歌,请使劲儿戳(这里) @车谷 :我发现每天上班都好困 ...

小小编辑
今天
399
7
centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
4
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
13
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部