`
cobo85
  • 浏览: 114856 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Dom4J通过schema校验XML

阅读更多

      前段时间因项目需要和外部进行数据交换,采用XML为数据交换载体。这样就需要在数据交换前调用schema进行数据合法性校验,先通过XMLSpy工具制定好XSD验证文件(XMLSpy确实很方便),然后通过dom4j进行校验。废话不多说,关键代码贴下

     校验器:

import java.io.IOException;

import org.dom4j.io.SAXReader;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;



public class Validateor {
	public static SAXReader reader;
	private static EntityResolver aresolve;//校验器
	private static Validateor validateor=Validateor.getInstance();
	static{
		if(aresolve==null){
		aresolve=new EntityResolver(){
			public InputSource resolveEntity(String arg0, String arg1)
			throws SAXException, IOException {
				Resource resource =new ClassPathResource("com/***/***/***/***/a.xsd");
				return new InputSource(resource.getInputStream());
			}
	
			};
		}
		if(reader==null){
			reader=new SAXReader(true);
		}
		try {
			//符合的标准
			reader.setFeature("http://apache.org/xml/features/validation/schema", true);   
	        reader.setFeature("http://apache.org/xml/features/validation/schema-full-checking",true);
	        reader.setProperty("http://java.sun.com/xml/jaxp/properties/schemaLanguage","http://www.w3.org/2001/XMLSchema"); 
		} catch (SAXException e1) {
			System.err.println("设置校验参数错误");;
		} 
		
	}
	private Validateor(){
		
	}
	public static SAXReader valid(String type){
		//根据不同的类型读取相应的校验文件,此处删除了一些业务代码
		if("01".equals(type))  reader.setEntityResolver(aresolve);
		return reader;
	}
	
	synchronized public static Validateor getInstance(){
		
		if(validateor==null){
			
			validateor=new Validateor();
		}
		return validByXsd;
		
	}

}

 

  校验方法

 

  

public Object validXmlData(String filePath, String type) {
		InputStreamReader streamReader=null;
		try {
			FileInputStream in = new FileInputStream(new File(filePath));
			//编码格式统一处理,支持非utf-8格式的声明文件
			streamReader= new InputStreamReader(in,"UTF-8");
			
		} catch (Exception e) {
			return "读取文件出现异常:"+e.getLocalizedMessage();
			
		}
		
		try {
			Document dateXml=Validateor.valid(type).read(streamReader);
			dateXml.setXMLEncoding("UTF-8");
			return dateXml;
		} catch (DocumentException e) {
			return "文件校验失败:"+e.getLocalizedMessage();
			
		}
		
	}

 

  Schema

 用XMLSpy生成,只把需要注意的命名空间贴上

 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.xxx.com" targetNamespace="http://www.xxx.com" elementFormDefault="qualified">

 验证的XML

  

<account-data 
              xmlns="http://www.xxx.com" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation="http://www.xxx.com a.xsd">

 

注意在XML的声明处: xsi:schemaLocation="http://www.xxx.com a.xsd"> 后面的a.xsd就是前面的schema名字,与前面的中间http://www.xxx.com 之间有空格。

 

 PS:加上命名空间的XML不能直接用dom4j的selectNodes之类的API得到节点,需要对XPATH进行设置,用dom4j的elements方法比较简单些,具体API可以翻阅dom4j的文档(如无特别要求还是不加命名空间的比较简便,校验方法都是一样的,但取值比较方便)。得到节点的属性值可以用:node.valueOf("@属性名")来取得。

 

分享到:
评论
1 楼 wayilau 2013-03-07  
这个可以一次性的校验出xml 中的所有问题吗?如果不行,有什么解决办法?

相关推荐

    Java通过XML Schema校验XML

    ava校验XML是件很扯淡的事情,... 下面不扯这些废话了,我用DOM4j结合javaxml api使用XSD来校验一个xml有效性,下面这个例子虽然和蹩脚,但是也费了一番功夫,放出来大家研究吧,有更好的实现也希望能和我一同分享。

    xml dom,sax解析,schema验证

    xerces-c++ 2.8应用,主要报错xml文件的解析,创建,修改保存。schema验证的。希望对初学者有所帮助.

    dom4.jar包,高效xml解析

    dom4j是现在见到的解析xml效率最高的jar包,并且支持XPath定位,xml schema验证等功能。

    DOMCount.rar_Schema C_XML程序开发_personal_xml list_解析xml

    自己开发的XML DOM计数程序DOMCount,使用DOM API解析XML文件,构造DOM树,然后遍历DOM树并计算元素个数(仅使用一个API调用)。 DOMCount解析XML文件,计算其元素数并打印。 用法: DOMCount [options]&lt;XML file...

    [XML入门经典(第4版)].(Beginning.XML.4th.Edition).(美)亨特,(美)拉夫特,(美)福思特.扫描版.pdf

    主要内容有XML基本语法、DTD、XML Schema、RELAX NG、XPath、XSLT、XQuery、DOM、SAX、RSS、Web服务、Ajax、SOAP、CSS、XHTML、SVG和XForms等,每章都有习题,书后附有参考答案,可帮助你全面掌握XML及其应用方法。...

    day023-xml解析笔记和代码.rar

    由于DOM4J在解析XML时只能一层一层解析,所以当XML文件层数过多时使用会很不方便, 结合XPATH就可以直接获取到某个元素 使用dom4j支持xpath的操作的几种主要形式 第一种形式 /a/b/c: 表示一层...

    C# XML入门经典

    主要内容包括:XML语法和格式良好的XML,XML命名空间,利用DTD和XML Schema进行XML验证,使用SOAP和Web服务,以及运用ADO.NET进行数据库访问等。本书还用两个案例分析来展示XML的具体应用。  本书适合于有一定的...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

     好了,通过第三章的学习,我们已经了解了一些XML和DTD的基本术语,但是我们还不知道怎样来写这些文件,需要遵循什么样的语法,在下一章,将重点介绍有关撰写XML和DTD文档的语法。 第四章 XML语法 七.DTD的语法...

    tinyxml+tinyxpath组合编程套件,很好的编程工具,都是源码

    因此,解析器也分为两种,一种是验证的,即会跟据XML文件中的声明,用相应的DTD文件对XML文件进行校验,检查它是否满足DTD文件的要求。另一种是忽略DTD文件,只要基本格式正确,就可以进行解析。 就我所知,验证的...

    C#XML入门经典 C#编程人员必备的XML技能.part2

    XML模式和.NET &lt;br&gt;11.1 在Visual Studio.NET中利用模式编辑器 11.1.1 从XML文档中生成模式 11.1.2 通过编程方式验证XML 11.1.3 处理异常和利用ValidationEventHandler 11.2 XSD和用xsd.exe进行串行...

    W3school_20100923.chm

    2010年09月23日 的版本。 ...XHTML XHTML 1.0 ...TCP/IP CSS 2.0 XML教程 JavaScript XML jQuery ...XML DOM HTML DOM XSL XML DOM ...Schema XSL-FO ...HTML DOM HTML 实例 ... 验证XML 验证WML

    XML技术 ppt

    126页 XML 简介 编写 XML 文档 使用 DTD 验证 XML 文档 使用 Schema 定义和验证 XML 文档 了解 XML 命名空间 使用 XSLT 转换 XML 文档 使用 DOM 读取和操作 XML 文档 使用 SAX 读取 XML 文档

    W3school CHM 2011.03 最新版

    HTML教程 HTML XHTML CSS TCP/IP XML教程 XML XSL XSLT XSL-FO XPath XQuery XLink XPointer DTD Schema XML DOM XForms SOAP WSDL RDF RSS ...HTML DOM ...HTML DOM XML DOM ...XML DOM 实例 ...验证XML 验证

    ISO-IEC-19776-1.2-X3DEncodings-XML

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

    w3school最新版11.12.6.chm

    最新版w3school帮助文档,集成了最新的jQuery 高压缩 只有不足6M的文件 包含的技术有: ...XHTML CSS TCP/IP XML教程 ...XML DOM ...Schema ...HTML DOM ...HTML DOM XML DOM ...HTML DOM 实例 ...验证XML 验证WML

    W3school.chm

    XHTML CSS TCP/IP XML教程 XML XSL XSLT XSL-FO ...Schema XML DOM ...HTML DOM ...通过使用我们的在线编辑器,你可以编辑这些例子,并对代码进行实验。...快捷易懂的学习方式 一寸光阴一寸金,因此,...验证XML 验证WML

    w3school chm

    哟两个w3school chm,一个版本比较新,一个是旧版,可以结合使用 ... ... XHTML CSS ...Schema ...XML DOM ...HTML DOM ...通过使用我们的在线编辑器,你可以编辑这些例子,并对代码进行实验。...验证XML 验证WML

    基于Java的XML解析与反射设计模式.doc

    xstream是一种序列 化工具而不是数据绑定工具,就是说不能从xml或者xml schema definition (xsd)文件生成类。 和其他序列化工具相比,xstream 有三个突出的特点: xstream不关心序列化/逆序列化的类的字段的可见性...

    ISO-IEC-19775-1.2-X3D-AbstractSpecification

    X3D是一种专为万维网而设计的三... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所发为其通用规范中的一个。英文

    ISO-IEC-19776-X3DEncodings-All-Edition-1

    X3D是一种专为万维网而设计... X3D 基于 XML 格式开发,所以可以直接使用 XML DOM 文档树、XML Schema 校验等技术和相关的 XML 编辑工具。目前 X3D 已经是通过 ISO 认证的国际标准。所传为其通用技术规范的一个。英文。

Global site tag (gtag.js) - Google Analytics