背景:做的数据同步框架,数据同步种类通过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配置文件

 <?xml version="1.0" encoding="UTF-8"?>

 <ships>

     <ship>
<id>1</id>
<name>1</name>
<cron>1</cron>
<sources>
<source></source>
<source></source>
<source></source>
</sources>
<aims>
<aim></aim>
<aim></aim>
<aim></aim>
</aims>
<type>1</type>
<handles>
<handle>
<head></head>
<body></body>
<end></end>
</handle>
</handles>
</ship> <ship>
<id>1</id>
<name>1</name>
<cron>1</cron>
<sources>
<source></source>
<source></source>
<source></source>
</sources>
<aims>
<aim></aim>
<aim></aim>
<aim></aim>
</aims>
<type>1</type>
<handles>
<handle>
<head></head>
<body></body>
<end></end>
</handle>
</handles>
</ship> <ship>
<id>1</id>
<name>1</name>
<cron>1</cron>
<sources>
<source></source>
<source></source>
<source></source>
</sources>
<aims>
<aim></aim>
<aim></aim>
<aim></aim>
</aims>
<type>1</type>
<handles>
<handle>
<head></head>
<body></body>
<end></end>
</handle>
</handles>
</ship> <ship>
<id>1</id>
<name>1</name>
<cron>1</cron>
<sources>
<source></source>
<source></source>
<source></source>
</sources>
<aims>
<aim></aim>
<aim></aim>
<aim></aim>
</aims>
<type>1</type>
<handles>
<handle>
<head></head>
<body></body>
<end></end>
</handle>
</handles>
</ship> </ships>

xml 配置文件

我的xsd检验规范文件

 <?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <!-- 顶层元素规范定义-->
<xs:element name="ships">
<xs:complexType ><!-- 复杂元素定义-->
<xs:sequence><!-- 要求子元素必须按顺序出现。每个子元素可出现 0 到任意次数-->
<!-- ship元素标签列表定义-->
<xs:element name="ship" type="ship_type" minOccurs="0" maxOccurs="unbounded"/>
<!-- 注意 上述type 说明标签ship的结构 具体结构定义看下面-->
</xs:sequence>
</xs:complexType>
</xs:element> <!-- 第二层节点定义 -->
<xs:complexType name="ship_type">
<xs:sequence>
<xs:element name="id" type="xs:string"></xs:element><!-- 简单元素节点定义 -->
<xs:element name="name" type="xs:string"></xs:element>
<xs:element name="cron" type="xs:string"></xs:element>
<xs:element name="sources"><!-- 简单list节点定义-->
<xs:complexType>
<xs:sequence>
<xs:element name="source" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="aims">
<xs:complexType>
<xs:sequence>
<xs:element name="aim" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="type" type="xs:string"></xs:element>
<xs:element name="handles"><!--handles标签子节点定义 -->
<xs:complexType>
<xs:sequence>
<xs:element name="handle" type="handle_type" minOccurs="0" maxOccurs="unbounded"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
<!-- 第三层标签节点格式定义 -->
<xs:complexType name="handle_type">
<xs:sequence>
<xs:element name="head" type="xs:string"></xs:element>
<xs:element name="body" type="xs:string"></xs:element>
<xs:element name="end" type="xs:string"></xs:element>
</xs:sequence>
</xs:complexType>
</xs:schema>

xml 格式校验文件 xsd

xml文件检验工具(非个人开发,网上直接copy,经测试可用-校验工具尚需自己完善,但是架子ok了。传送门:http://www.cnblogs.com/qqzy168/p/3394312.html)

 package xml.util;

 import org.xml.sax.SAXException;

 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 java.io.File;
import java.io.IOException; /**
* Created by robin on 2016/6/12.
*
* @author robin
*/
public class ValidateXML {
private ValidateXML() { } public static boolean validateXml(String xsdPath, String xmlPath)
throws SAXException, IOException {
// 建立schema工厂
SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
// 建立验证文档文件对象,利用此文件对象所封装的文件进行schema验证
File schemaFile = new File(xsdPath);
// 利用schema工厂,接收验证文档文件对象生成Schema对象
Schema schema = schemaFactory.newSchema(schemaFile);
// 通过Schema产生针对于此Schema的验证器,利用schenaFile进行验证
Validator validator = schema.newValidator();
// 得到验证的数据源
Source source = new StreamSource(xmlPath);
// 开始验证,成功输出success!!!,失败输出fail
validator.validate(source); return true;
}
}

ValidateXML

测试demo

 package xml.xmlDemo;

 import org.xml.sax.SAXException;
import xml.util.ValidateXML; import java.io.IOException; /**
* Created by robin on 2016/6/12.
*
* @author robin
*/
public class Test { public static void main(String args[]) throws IOException, SAXException {
System.out.print(ValidateXML.validateXml("src\\xml\\xmlDemo\\ships.xsd", "src\\xml\\xmlDemo\\ships.xml"));
}
}

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。并在文章最后一行附上本句话。否则,作者保留追究的权利。

xml 配置文件规范 校验的更多相关文章

  1. 自定义xml配置文件之dtd文件校验

    用了很多第三方库,也看了些源码,总是想如果自己写一个类似的库,读取xml配置文件(properties配置文件比较简单) 该如何给配置文件添加头,添加校验,因为xml配置文件相对于properties ...

  2. Maven的pom.xml配置文件详解

    Maven简述 Maven项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具.由于 Mav ...

  3. maven的pom.xml配置文件讲解

    <project xmlns="http://maven.apache.org/POM/4.0.0 "     xmlns:xsi="http://www.w3.o ...

  4. struts2中struts.xml配置文件详解【未整理】

    1.    深入Struts2的配置文件 本部分主要介绍struts.xml的常用配置. 1.1.    包配置: Struts2框架中核心组件就是Action.拦截器等,Struts2框架使用包来管 ...

  5. Java学习-023-Properties 类 XML 配置文件读取及写入源代码

    之前的几篇 Properties 文章已经讲述过了 Java 配置文件类 Properties 的基本用法,查看 JDK 的帮助文档时,也可看到在 Properties 类中还有两个方法 loadFr ...

  6. Maven之(六)setting.xml配置文件详解

    setting.xml配置文件 maven的配置文件settings.xml存在于两个地方: 1.安装的地方:${M2_HOME}/conf/settings.xml 2.用户的目录:${user.h ...

  7. web.xml配置文件的简单说明

    简单说一下,web.xml的加载过程.当我们启动一个WEB项目容器时,容器包括(JBoss,Tomcat等).首先会去读取web.xml配置文件里的配置,当这一步骤没有出错并且完成之后,项目才能正常的 ...

  8. Spring的xml配置文件中约束的必要性 找不到元素 'beans' 的声明

    今天在复习Spring MVC框架的时候,只知道xml配置文件中的约束有规范书写格式的作用,所以在配置HandlerMapping对象信息的时候没有加入约束信息之后进行测试,没有遇到问题.后来在配置S ...

  9. Maven之setting.xml配置文件详解

    setting.xml配置文件 maven的配置文件settings.xml存在于两个地方: 1.安装的地方:${M2_HOME}/conf/settings.xml 2.用户的目录:${user.h ...

随机推荐

  1. C语言新文法

    程序->外部声明 | 程序 外部声明 程序->外部声明A' A'->外部声明A'|ε 外部声明->修饰符 变量名 形参 修饰符->void | int | char | ...

  2. how to build apache log4cxx 0.10 by Visual Studio 201*

    Chapter 1 Official Steps  We are going to follow the steps here, http://logging.apache.org/log4cxx/b ...

  3. 第一次在linux上登录博客

    这是我第一次在linux操作系统上登录博客,额,虽然是在X-window上面.好吧,是我太激动了. 这意味着我已经步入linux的世界了,虽然中文输入法不太好用,但是我还是写一下我的心情吧. 从去年的 ...

  4. Apache Commons 系列简介 之 Pool

    一.概述 Apache Commons Pool库提供了一整套用于实现对象池化的API,以及若干种各具特色的对象池实现.2.0版本,并非是对1.x的简单升级,而是一个完全重写的对象池的实现,显著的提升 ...

  5. .Net Office开源组件

    1.NPOI NPOI 是 POI 项目的 .NET 版本.POI是一个开源的Java读写Excel.WORD等微软OLE2组件文档的项目.使用 NPOI 你就可以在没有安装 Office 或者相应环 ...

  6. C++引用详解

    引用的概念 引用:就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样. 引用的声明方法:类型标识符 &引用名=目标变量名: 如下:定义引用ra,它是变量a的引用,即别名. i ...

  7. JSON.stringify 在OA差旅中转换为字符串传给后端,(使用from表单的形式)

    $('#bookForm').find('#formData').val(transInfo.fromData).end().submit(); 这里的val()中的transInfo.fromDat ...

  8. EX:The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel.

    EX:The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secu ...

  9. t2712:字符串移位包含问题

    t2712:字符串移位包含问题   总时间限制:1000ms  内存限制:65536kB描述    给定两个字符串s1和s2,要求判定其中一个字符串    是否是另一字符串通过循环移位后的子字符串.例 ...

  10. maven3.2.3+eclipse4.4+JDK1.8+win8.1_64bit环境搭建

    --------------------------------------- 博文作者:迦壹 博客标题:win8.1_64bit+eclipse4.4+maven3.2.3+JDK1.8环境搭建 博 ...