• xml 配置文件规范 校验


    背景:做的数据同步框架,数据同步种类通过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。并在文章最后一行附上本句话。否则,作者保留追究的权利。

  • 相关阅读:
    搭建个人Spring-Initializr服务器
    “不蒜子”统计总访问人数脚本
    基于Hazelcast及Kafka实现的分布式锁与集群负载均衡
    虚拟机部署hadoop集群
    程序员、黑客及开发者之间的区别
    今日校园自动登录教程
    逆向DES算法
    来自穷逼对HttpCanary的蹂躏
    今日校园提交签到和查寝-Java实现
    JS 判断数据类型方法
  • 原文地址:https://www.cnblogs.com/robinjava77/p/5578224.html
Copyright © 2020-2023  润新知