为编程爱好者分享易语言教程源码的资源网
好用的代理IP,游戏必备 ____广告位招租____ 服务器99/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器
好用的代理IP,游戏必备 ____广告位招租____ 服务器低至38/年 ____广告位招租____ ____广告位招租____ 挂机,建站服务器

网站首页 > 网络编程 正文

xml 配置文件规范 校验(xml文件如何配置)

三叶资源网 2022-09-03 20:18:50 网络编程 207 ℃ 0 评论

背景:做的数据同步框架,数据同步种类通过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。希望古人诚不坑我,虽然已经见过好多人的blog都是千篇一律的copy。

xml schema 的学习,建议去官方网站学习。虽然复杂的校验没有,但是有简易的入门示例。传送门:http://w3school.com.cn/schema/index.asp

自己的xml配置文件格式是比较复杂的,在短时间内,没法通过官网快速学习到。通过官网只是了解了基本规范配置,xml和xsd文件之间的关系。

如何配置更复杂的xml数据格式校验,只能靠自己根据官方的说明来“瞎写”来测试和看看前辈来如何做的。可惜大多数前辈都是把官方的xsd文档一抄,就完事了。就第一个写这类博客的人留下了可用的java校验xml的工具方法。

在通过谷歌翻阅不少网页后,终于看到一位前辈写了实际有用的技术分享,传送门:http://bbs.esnai.com/forum.php?mod=viewthread&action=printable&tid=1568142

!废话说了太多,再次感谢前面两位前辈,站在他们肩膀上,做xml schema解析就非常快了。

下面上正菜:

我的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,经测试可用,传送门: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,欢迎大伙前来指正或是交流。

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

Tags:

来源:三叶资源网,欢迎分享,公众号:iisanye,(三叶资源网⑤群:21414575

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

百度站内搜索
关注微信公众号
三叶资源网⑤群:三叶资源网⑤群

网站分类
随机tag
色彩识别360UIPugiXml编码转换类黑月界面类3.8安卓协议FTP服务器QQ资料照片墙上传vueGDIckplayer示例动态调用汇编IOCP抖音评论采集精易模块易语言源码网EXUI缓动登陆界面源码QQ群签到链接器WEB交互
最新评论