背景:做的数据同步框架,数据同步种类通过xml配置文件添加。为了系统的稳定性,我们只能认为将来写这个运行配置xml的人是一个傻瓜,那么对xml格式校验就很重要。

通过dom4j,是可以完成对xml格式的校验。但是代码实现冗长,不便阅读和维护。而且后面校验格式一旦修改,代码方面的修改就是牵一发而动全身。看着实在蛋疼,于是为了“偷懒”,我弃用了别人实现的dom4j校验xml数据格式的方法。

通过在网络上查阅,发现对xml格式校验的常用方法:①DTD语法;②xml schema语法。

下面是关于DTD和Schema的对比(摘自:http://www.oseye.net/user/kevin/blog/283)

  1. DTD 的局限性
  2.  
  3. DTD不遵守XML语法(写XML文档实例时候用一种语法,写DTD的时候用另外一种语法)
  4. DTD数据类型有限(与数据库数据类型不一致)
  5. DTD不可扩展
  6. DTD不支持命名空间(命名冲突)
  7. Schema的新特性
  8.  
  9. Schema基于XML语法
  10. Schema可以用能处理XML文档的工具处理
  11. Schema大大扩充了数据类型,可以自定义数据类型
  12. Schema支持元素的继承—Object-Oriented
  13. 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。并在文章最后一行附上本句话。否则,作者保留追究的权利。

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. JS-学习-DOM元素尺寸和位置

    一,获取元素的css大小 1.通过style内联获取元素的大小 var box = document.getElementById('box');    // 获得元素;     box.style. ...

  2. 随机函数的代码(srand、rand)

    #include<stdio.h> int main() int counter; for(counter=0;counter<10;counter++) { srand(count ...

  3. [原创]C++通用宏定义

    //单态模式(singletion) #defube DECLEAR_SINGLETION(ClassName) \ private: \ static ClassName* m_pInstance; ...

  4. Pyhton的发展历程

    Python的由来 在1989年12月时,吉多·范罗苏姆——龟叔,想寻找一门“课余”编程项目来打发圣诞节前后的时间.Guido决定为当时正构思的一个新的脚本语言写一个解释器,它是ABC语言(教学语言. ...

  5. Sklearn库例子——决策树分类

    Sklearn上关于决策树算法使用的介绍:http://scikit-learn.org/stable/modules/tree.html 1.关于决策树:决策树是一个非参数的监督式学习方法,主要用于 ...

  6. 百度地图api 标注的图标不显示问题

    图中郑州PPT设计制作中心前面应该有一个小的标,但是死活就是不显示. 经过百度搜索和测试,终于解决.应该是页面定义的CSS和百度的冲突了,解决办法如下: 在当前页面中,加入 <style typ ...

  7. java读取文件内容

    获取文件内容 picurl = "http://www.baidu.com/data.txt"; URL urlfile = new URL(picurl); BufferedRe ...

  8. Lab_6_SysOps_AutoScaling_Linux_v2.5

    System Operations - Lab 6: Using Amazon Elastic Load Balancer (Linux) - 2.5 ======================== ...

  9. 如何在ubuntu里面关掉后台的meteor

    kill -9 `ps ax | grep node | grep meteor | awk '{print $1}'` 或者远程终止服务器里面的meteor  ssh [user]@[server] ...

  10. 开始python学习了

    今晚折腾了半天,终于在mac上把python开发ide搞好了. 本来是打算使用eclipse+pydev的,结果在eclipse marketplace里面搜索到得pydev插件无法安装,一直是提示网 ...