背景:做的数据同步框架,数据同步种类通过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支持属性组
因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>
我的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文件检验工具(非个人开发,网上直接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 }
测试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 }
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。并在文章最后一行附上本句话。否则,作者保留追究的权利。