背景:做的数据同步框架,数据同步种类通过xml配置文件添加。为了系统的稳定性,我们只能认为将来写这个运行配置xml的人是一个傻瓜,那么对xml格式校验就很重要。
通过dom4j,是可以完成对xml格式的校验。但是代码实现冗长,不便阅读和维护。而且后面校验格式一旦修改,代码方面的修改就是牵一发而动全身。看着实在蛋疼,于是为了“偷懒”,我弃用了别人实现的dom4j校验xml数据格式的方法。
通过在网络上查阅,发现对xml格式校验的常用方法:①DTD语法;②xml schema语法。
下面是关于DTD和Schema的对比(摘自:http://www.oseye.net/user/kevin/blog/283)
DTD 的局限性 DTD不遵守XML语法(写XML文档实例时候用一种语法,写DTD的时候用另外一种语法) DTD数据类型有限(与数据库数据类型不一致) DTD不可扩展 DTD不支持命名空间(命名冲突) Schema的新特性 Schema基于XML语法 Schema可以用能处理XML文档的工具处理 Schema大大扩充了数据类型,可以自定义数据类型 Schema支持元素的继承—Object-Oriented’ Schema支持属性组
DTD Schema对比
因schema和dtd,自己以前都没怎么深入研究过。看了很多人都说schema都将取代dtd,因此站在前辈的肩膀上就直接使用了schema。希望古人诚不坑我,虽然已经见过好多人的blog都是千篇一律的copy。
xml schema 的学习,建议去官方网站学习。虽然复杂的校验没有,但是有简易的入门示例。传送门:http://w3school.com.cn/schema/index.asp
自己的xml配置文件格式是比较复杂的,在短时间内,没法通过官网快速学习到。通过官网只是了解了基本规范配置,xml和xsd文件之间的关系。
如何配置更复杂的xml数据格式校验,只能靠自己根据官方的说明来“瞎写”来测试和看看前辈来如何做的。可惜大多数前辈都是把官方的xsd文档一抄,就完事了。就第一个写这类博客的人留下了可用的java校验xml的工具方法。
在通过谷歌翻阅不少网页后,终于看到一位前辈写了实际有用的技术分享,传送门:http://bbs.esnai.com/forum.php?mod=viewthread&action=printable&tid=1568142
!废话说了太多,再次感谢前面两位前辈,站在他们肩膀上,做xml schema解析就非常快了。
下面上正菜:
我的xml配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 3 <ships> 4 5 <ship> 6 <id>1</id> 7 <name>1</name> 8 <cron>1</cron> 9 <sources> 10 <source></source> 11 <source></source> 12 <source></source> 13 </sources> 14 <aims> 15 <aim></aim> 16 <aim></aim> 17 <aim></aim> 18 </aims> 19 <type>1</type> 20 <handles> 21 <handle> 22 <head></head> 23 <body></body> 24 <end></end> 25 </handle> 26 </handles> 27 </ship> 28 29 <ship> 30 <id>1</id> 31 <name>1</name> 32 <cron>1</cron> 33 <sources> 34 <source></source> 35 <source></source> 36 <source></source> 37 </sources> 38 <aims> 39 <aim></aim> 40 <aim></aim> 41 <aim></aim> 42 </aims> 43 <type>1</type> 44 <handles> 45 <handle> 46 <head></head> 47 <body></body> 48 <end></end> 49 </handle> 50 </handles> 51 </ship> 52 53 <ship> 54 <id>1</id> 55 <name>1</name> 56 <cron>1</cron> 57 <sources> 58 <source></source> 59 <source></source> 60 <source></source> 61 </sources> 62 <aims> 63 <aim></aim> 64 <aim></aim> 65 <aim></aim> 66 </aims> 67 <type>1</type> 68 <handles> 69 <handle> 70 <head></head> 71 <body></body> 72 <end></end> 73 </handle> 74 </handles> 75 </ship> 76 77 <ship> 78 <id>1</id> 79 <name>1</name> 80 <cron>1</cron> 81 <sources> 82 <source></source> 83 <source></source> 84 <source></source> 85 </sources> 86 <aims> 87 <aim></aim> 88 <aim></aim> 89 <aim></aim> 90 </aims> 91 <type>1</type> 92 <handles> 93 <handle> 94 <head></head> 95 <body></body> 96 <end></end> 97 </handle> 98 </handles> 99 </ship> 100 101 </ships>
xml 配置文件
我的xsd检验规范文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 3 4 <!-- 顶层元素规范定义--> 5 <xs:element name="ships"> 6 <xs:complexType ><!-- 复杂元素定义--> 7 <xs:sequence><!-- 要求子元素必须按顺序出现。每个子元素可出现 0 到任意次数--> 8 <!-- ship元素标签列表定义--> 9 <xs:element name="ship" type="ship_type" minOccurs="0" maxOccurs="unbounded"/> 10 <!-- 注意 上述type 说明标签ship的结构 具体结构定义看下面--> 11 </xs:sequence> 12 </xs:complexType> 13 </xs:element> 14 15 <!-- 第二层节点定义 --> 16 <xs:complexType name="ship_type"> 17 <xs:sequence> 18 <xs:element name="id" type="xs:string"></xs:element><!-- 简单元素节点定义 --> 19 <xs:element name="name" type="xs:string"></xs:element> 20 <xs:element name="cron" type="xs:string"></xs:element> 21 <xs:element name="sources"><!-- 简单list节点定义--> 22 <xs:complexType> 23 <xs:sequence> 24 <xs:element name="source" minOccurs="0" maxOccurs="unbounded"/> 25 </xs:sequence> 26 </xs:complexType> 27 </xs:element> 28 <xs:element name="aims"> 29 <xs:complexType> 30 <xs:sequence> 31 <xs:element name="aim" minOccurs="0" maxOccurs="unbounded"/> 32 </xs:sequence> 33 </xs:complexType> 34 </xs:element> 35 <xs:element name="type" type="xs:string"></xs:element> 36 <xs:element name="handles"><!--handles标签子节点定义 --> 37 <xs:complexType> 38 <xs:sequence> 39 <xs:element name="handle" type="handle_type" minOccurs="0" maxOccurs="unbounded"></xs:element> 40 </xs:sequence> 41 </xs:complexType> 42 </xs:element> 43 </xs:sequence> 44 </xs:complexType> 45 <!-- 第三层标签节点格式定义 --> 46 <xs:complexType name="handle_type"> 47 <xs:sequence> 48 <xs:element name="head" type="xs:string"></xs:element> 49 <xs:element name="body" type="xs:string"></xs:element> 50 <xs:element name="end" type="xs:string"></xs:element> 51 </xs:sequence> 52 </xs:complexType> 53 </xs:schema>
xml 格式校验文件 xsd
xml文件检验工具(非个人开发,网上直接copy,经测试可用,传送门:http://www.cnblogs.com/qqzy168/p/3394312.html)
1 package xml.util; 2 3 import org.xml.sax.SAXException; 4 5 import javax.xml.transform.Source; 6 import javax.xml.transform.stream.StreamSource; 7 import javax.xml.validation.Schema; 8 import javax.xml.validation.SchemaFactory; 9 import javax.xml.validation.Validator; 10 import java.io.File; 11 import java.io.IOException; 12 13 /** 14 * Created by robin on 2016/6/12. 15 * 16 * @author robin 17 */ 18 public class ValidateXML { 19 private ValidateXML { 20 21 } 22 23 public static boolean validateXml(String xsdPath, String xmlPath) 24 throws SAXException, IOException { 25 // 建立schema工厂 26 SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema"); 27 // 建立验证文档文件对象,利用此文件对象所封装的文件进行schema验证 28 File schemaFile = new File(xsdPath); 29 // 利用schema工厂,接收验证文档文件对象生成Schema对象 30 Schema schema = schemaFactory.newSchema(schemaFile); 31 // 通过Schema产生针对于此Schema的验证器,利用schenaFile进行验证 32 Validator validator = schema.newValidator; 33 // 得到验证的数据源 34 Source source = new StreamSource(xmlPath); 35 // 开始验证,成功输出success!!!,失败输出fail 36 validator.validate(source); 37 38 return true; 39 } 40 }
ValidateXML
测试demo
1 package xml.xmlDemo; 2 3 import org.xml.sax.SAXException; 4 import xml.util.ValidateXML; 5 6 import java.io.IOException; 7 8 /** 9 * Created by robin on 2016/6/12. 10 * 11 * @author robin 12 */ 13 public class Test { 14 15 public static void main(String args[]) throws IOException, SAXException { 16 System.out.print(ValidateXML.validateXml("src\\xml\\xmlDemo\\ships.xsd", "src\\xml\\xmlDemo\\ships.xml")); 17 } 18 }
Test
正菜就这么点,自己也是刚开始玩schema,欢迎大伙前来指正或是交流。
以上内容,都经过本人实践验证过。若转发,请在标题上标记[转],并注明原文链接:http://www.cnblogs.com/robinjava77/p/5578224.html,作者名称:robin。并在文章最后一行附上本句话。否则,作者保留追究的权利。
本文暂时没有评论,来添加一个吧(●'◡'●)