文档章节

Java基于Schema验证xml

hefeiuu
 hefeiuu
发布于 2017/05/04 20:29
字数 551
阅读 10
收藏 0
点赞 0
评论 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处理XML文档——先睹为快

JAXB以其方便的XML数据处理能力可能会引起你的兴趣。你可能还不了解JAXB是什么,想要知道它到底有 什么好处,如果这是你需要的,你才会再花时间去细细的研究它,或者你只需要使用最基本的功能...

晨曦之光
2012/03/09
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
XML&Java&XMLBeans结合应用的价值

通过阅读本文,您将了解面向服务的架构(Service-Oriented Architecture,SOA)、XML 和 XMLBeans 如何在解决实际商业问题中发挥重要作用及其原因,文中将以娱乐业为例进行案例分析。本文的目的...

晨曦之光
2012/03/09
0
0
2010(初次接触EJB 小节)

初次体验了下EJB的开发 今天整理了下 企业中就我自己公司里面对于EJB的使用做一次切身的体会 配置数据源,因为Ejb工程 是要部署到jboss的 所以在jboss里面配置数据源和tomcat里面多少有些出入...

Zofda
2012/02/28
0
0
基于 XML Schema 的数据存储方案

引言 对于一些小型的项目,需要存储的数据字段和数据量可能都比较小,为了降低项目成本,或提高项目的独立性,开发人员希望能不依赖数据库进行开 发。此时,利用 XML Schema 进行数据存储便是...

曾赛
2009/09/19
0
0
XML Java与 XMLBeans结合应用的商业价值

通过阅读本文,您将了解面向服务的架构(Service-Oriented Architecture,SOA)、XML 和 XMLBeans 如何在解决实际商业问题中发挥重要作用及其原因,文中将以娱乐业为例进行案例分析。本文的目的...

晨曦之光
2012/03/09
0
0
xml java应用(DOM、SAX、JDOM、DOM4j)简介比较

dom是解析xml的底层接口之一(另一种是sax) 而jdom和dom4j则是基于底层api的更高级封装 dom是通用的,而jdom和dom4j则是面向java语言的 DOM 是用与平台和语言无关的方式表示 XML 文档的官方 ...

liangyx
2012/12/20
0
0
spring ioc注解 IOC

@Autowired 1、Spring 通过一个 BeanPostProcessor 对 @Autowired 进行解析,所以要让 @Autowired 起作用必须事先在 Spring 容器中声明 AutowiredAnnotationBeanPostProcessor Bean。 Java代...

五大三粗
2015/11/02
0
0
java解析xml的四种方法汇总

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM、SAX、JDOM和DOM4J 下面首先给出这四种方法的jar包下载地址 DOM:在现在的Java JDK里都自带了,在xml-apis.jar包里 SA...

LYQ1990
2017/10/26
0
0
基于Solr的全文搜索服务器的安装部署

Apache Solr 是一个开源的搜索服务器。Solr 使用 Java 语言开发,主要基于 HTTP 和 Apache Lucene 实现。Apache Solr 中存储的资源是以 Document 为对象进行存储的。每个文档由一系列的 Fiel...

mickelfeng
2013/01/02
0
1

没有更多内容

加载失败,请刷新页面

加载更多

下一页

关于DCL双重锁失效及解决方案

关于DCL双重锁失效及解决方案 Double Check Lock (DCL)实现单例 DCL 方式实现单例的优点是既能够在需要时才初始化单例,又能够保证线程安全,且单例对象初始化后调用getInstance方法不进行...

DannyCoder
13分钟前
0
0
PowerDesigner 16.5 安装配置

PowerDesigner16.5破解版是一款业内领先且开发人员常用的数据库建模工具,PowerDesigner可以从物理和概念两个层面设计数据库,方便用户制作处清晰直观的数据流程图和结构模型,欢迎有需要的朋...

Gibbons
38分钟前
0
0
前端Tips: 创建, 发布自己的 Vue UI 组件库

创建, 发布自己的 Vue UI 组件库 前言 在使用 Vue 进行日常开发时, 我们经常会用到一些开源的 UI 库, 如: Element-UI, Vuetify 等. 只需一行命令, 即可方便的将这些库引入我们当前的项目: n...

ssthouse_hust
今天
1
0
大数据教程(2.13):keepalived+nginx(多主多活)高可用集群搭建教程【自动化脚本】

上一章节博主为大家介绍了目前大型互联网项目的keepalived+nginx(主备)高可用系统架构体系,相信大家应该看了博主的文章对keepalived/nginx技术已经有一定的了解,在本节博主将为大家分享k...

em_aaron
今天
4
0
Git 2.18版本发布:支持Git协议v2,提升性能

在最新的官方 Git 客户端正式版2.18中添加了对 Git wire 协议 v2 的支持,并引入了一些性能与 UI 改进的新特性。在 Git 的核心团队成员 Brandon Williams 公开宣布这一消息前几周,Git 协议 ...

六库科技
今天
0
0
Java8新特性之接口

在JDK8以前,我们定义接口类中,方法都是抽象的,并且不能存在静态方法。所有的方法命名规则基本上都是 public [返回类型] [方法名](参数params) throws [异常类型] {}。 JDK8为接口的定义带...

developlee的潇洒人生
今天
0
0
aop + annotation 实现统一日志记录

aop + annotation 实现统一日志记录 在开发中,我们可能需要记录异常日志。由于异常比较分散,每个 service 方法都可能发生异常,如果我们都去做处理,会出现很多重复编码,也不好维护。这种...

长安一梦
今天
2
0
将博客搬至CSDN

AHUSKY
今天
2
0
Python web框架Django学习(1)

1.Django简介 (1)Python下有许多款不同的 Web 框架。Django是重量级选手中最有代表性的一位。许多成功的网站和APP都基于Django。Django是一个开放源代码的Web应用框架,由Python写成。 (2...

十年磨一剑3344
今天
0
0
Databook-数据之书

Databook-数据之书 用于数据分析的Jupyter Notebooks。 不需购买服务器,快速开始自己的数据分析过程。 源码:https://github.com/openthings/databook 作者:openthings,https://github.co...

openthings
今天
12
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部