robin_77
偷懒是一种必备素质

背景:做的数据同步框架,数据同步种类通过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。希望古人诚不坑我!

 

xml schema 的学习,建议去官方网站学习。传送门:http://w3school.com.cn/schema/index.asp

 

一位前辈写了实际有用的技术分享,传送门:http://bbs.esnai.com/forum.php?mod=viewthread&action=printable&tid=1568142

 

下面上正菜:

 我的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,经测试可用-校验工具尚需自己完善,但是架子ok了。传送门: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强大之处还在于,通过xsd,可以让写配置文件的人,在编写xml就知道自己写的对不对,哪里写错了。

将ship标签改为<ship xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ships.xsd"> ....</ship>

 

 

正菜就这么点,自己也是刚开始玩schema,欢迎大伙前来指正或是交流。

 

 

后记:xml schema 进行xml格式校验还有很多强大之处。尚待各位去摸索...

以上内容,都经过本人实践验证过。若转发,请在标题上标记[转],并注明原文链接:http://www.cnblogs.com/robinjava77/p/5578224.html ,作者名称:robin。并在文章最后一行附上本句话。否则,作者保留追究的权利。

posted on 2016-06-12 18:30  robin_77  阅读(5794)  评论(0编辑  收藏  举报