先来xml文件:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <!DOCTYPE orders SYSTEM "orders.dtd">
3 <orders> <!-- 所有订单信息 -->
4 <order orderDate="2003-10-20"> <!--orderDate为日期型 -->
5 <shipTo country="CN"><!--country必须出现 -->
6 <name>张三峰</name> <!-- 收件人 -->
7 <street>市中区滨河路778号5+3大酒店</street> <!-- 县/区及街道地址 -->
8 <city>乐山市</city> <!-- 市/区 -->
9 <state>四川省</state> <!-- 省/自治区/直辖市 -->
10 <phone>13999999999</phone> <!-- 联系电话 -->
11 </shipTo>
12 <items> <!-- 商品列表,item应至少出现1次 -->
13 <item partNum="872-AA"> <!--商品编号,必须有 -->
14 <productName>Lawnmower</productName><!-- 商品名称 -->
15 <quantity>1</quantity> <!-- 购买数量 -->
16 <price>148.95</price> <!-- 单价 -->
17 <shipDate>2003-10-21</shipDate> <!-- 配送日期 -->
18 </item>
19 <item partNum="926-AA">
20 <productName>Baby Monitor</productName>
21 <quantity>1</quantity>
22 <price>39.98</price>
23 <shipDate>2003-10-22</shipDate>
24 </item>
25 </items>
26 </order>
27 </orders>

orders.xml

再来对应的dtd文件:

 1 <!ELEMENT orders (order*)>
2 <!ELEMENT order (shipTo*, items+)>
3
4 <!ELEMENT shipTo (name, street, city, state, phone)>
5 <!ELEMENT name (#PCDATA)>
6 <!ELEMENT street (#PCDATA)>
7 <!ELEMENT city (#PCDATA)>
8 <!ELEMENT state (#PCDATA)>
9 <!ELEMENT phone (#PCDATA)>
10
11 <!ELEMENT items (item+)>
12 <!ELEMENT item (productName, quantity, price, shipDate)>
13 <!ELEMENT productName (#PCDATA)>
14 <!ELEMENT quantity (#PCDATA)>
15 <!ELEMENT price (#PCDATA)>
16 <!ELEMENT shipDate (#PCDATA)>
17
18 <!ATTLIST order orderDate CDATA #REQUIRED>
19 <!ATTLIST shipTo country CDATA #REQUIRED>
20 <!ATTLIST item partNum CDATA #REQUIRED>

orders.dtd

<!--应该有些地方限制得不太合理,但是可以运行出来,这里主要记录一下Java文件-->

下面是对应的检查的Java类:

 1 import javax.xml.parsers.DocumentBuilder;
2 import javax.xml.parsers.DocumentBuilderFactory;
3 import org.w3c.dom.Document;
4
5 public class XmlDtdCheck {
6
7 public static void main(String[] args) {
8 // TODO Auto-generated method stub
9 try {
10 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
11 factory.setValidating(true);
12
13 DocumentBuilder builder = factory.newDocumentBuilder();
14 Document doc1 = (Document) builder.parse("orders.xml");
15 Document doc2 = (Document) builder.parse("citizen.xml");
16 // System.out.println(doc.getNodeValue());
17 // doc并不是null,它是一个对象
18 } catch (Exception e) {
19 // TODO: handle exception
20 System.err.println("ERROR!!!" + e.getMessage());
21 }
22 }
23
24 }

TestDTD.java

<!--这里只是转成了document类,并没有使用-->

然后又是一个严格一点的Java类:

 1 import java.io.File;
2
3 import java.io.*;
4 import org.xml.parsers.*;
5 import org.w3c.dom.*;
6 import java.util.Scanner;
7
8 public class TestValidate {
9
10 public static void main(String[] args) {
11 // TODO Auto-generated method stub
12 try {
13 DocumentBuilderFacory factor = DocumentBilderFactory.newInstance();
14 factor.setValidating(true);
15 DocumentBuilder builder = factory.newDocumentBuilder();
16 MyHandler handler = new MyHandler();
17 builder.setErrorHandler(handler);
18 Document document = builder.parse(new File("orders.xml"));
19
20 if(handler.errorMessage == null) {
21 System.out.println("文件是有效的");
22 } else {
23 System.out.println("文件是无效的");
24 }
25 } catch (Exception e) {
26 System.out.println(e);
27 }
28 }
29 }
30
31 class MyHandler extends DefaultHandler {
32 String errorMessage = null;
33
34 public void error(SAXParseException e) throws SAXException {
35 errorMessage = e.getMessage();
36 System.out.println("一般错误"+errorMessage);
37 }
38
39 public void fatalError(SAXParseException e) throws SAXException {
40 errorMessage = e.getMessage();
41 System.out.println("致命错误"+errorMessage);
42 }
43 }

TestValidate.java

代码未经验证,请检验后运行。


接下来是验证Schema文件下的XML文件的有效性。

老规矩——XML文件:

 1 <?xml version="1.0" encoding="utf-8"?>
2 <orders xmlns="http://www.w3school.com.cn"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xsi:schemaLocation="http://www.w3school.com.cn orders.xsd"> <!-- 所有订单信息 -->
5 <order> <!-- 订单,至少包含1个订单 -->
6 <orderDate>2018-05-20</orderDate><!--orderDate为日期型 -->
7 <shipTo country="CN"><!-- 配送信息,country属性必须出现 -->
8 <name>张三峰</name> <!-- 收件人,长度小于50 -->
9 <street>市中区滨河路778号5+3大酒店</street> <!-- 县/区及街道地址 -->
10 <city>乐山市</city> <!-- 市/区,长度小于50 -->
11 <state>四川省</state> <!-- 省/自治区/直辖市,长度小于50 -->
12 <phone>13999999999</phone> <!-- 联系电话,要求必须是1开头,后面第2位数字3-9,再后面是9个数字 -->
13 </shipTo>
14 <items> <!-- 商品列表,item应至少出现1次 -->
15 <item partNum="872-AA"> <!-- 商品编号属性,必须有 -->
16 <productName>香辣鸡翅</productName><!-- 商品名称,长度小于50 -->
17 <quantity>1</quantity> <!-- 购买数量,至少是1 -->
18 <price>18.95</price> <!-- 单价为浮点数,大于0.0 -->
19 <shipDate>2018-05-21</shipDate> <!-- 配送日期 -->
20 </item>
21 <item partNum="926-AA">
22 <productName>烧烤五花肉</productName>
23 <quantity>20</quantity>
24 <price>39.98</price>
25 <shipDate>2018-05-20</shipDate>
26 </item>
27 </items>
28 </order>
29 </orders>
30
31 <!--
32 xmlns="http://www.example.org/01"
33 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
34 xsi:noNameSpaceSchemaLocation="orders.xsd"
35 -->

orders.xml

xsd文件:

  1 <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
2 targetNamespace="http://www.w3school.com.cn"
3 xmlns="http://www.w3school.com.cn"
4 elementFormDefault="qualified">
5 <xsd:element name="orders">
6 <xsd:complexType>
7 <xsd:sequence>
8 <xsd:element ref="order" minOccurs="1" maxOccurs="unbounded"></xsd:element>
9 </xsd:sequence>
10 </xsd:complexType>
11 </xsd:element>
12
13 <xsd:element name="order">
14 <xsd:complexType>
15 <xsd:sequence>
16 <xsd:element name="orderDate" type="xsd:date" minOccurs="1" maxOccurs="1"></xsd:element>
17 <xsd:element ref="shipTo" minOccurs="1" maxOccurs="1"></xsd:element>
18 <xsd:element ref="items" minOccurs="1" maxOccurs="1"></xsd:element>
19 </xsd:sequence>
20 </xsd:complexType>
21 </xsd:element>
22
23 <xsd:element name="shipTo">
24 <xsd:complexType>
25 <xsd:sequence>
26 <xsd:element ref="name"></xsd:element>
27 <xsd:element name="street"></xsd:element>
28 <xsd:element name="city"></xsd:element>
29 <xsd:element name="state"></xsd:element>
30 <xsd:element ref="phone"></xsd:element>
31 </xsd:sequence>
32 <xsd:attribute name="country" type="xsd:string" use="required"></xsd:attribute>
33 </xsd:complexType>
34 </xsd:element>
35
36 <xsd:element name="items">
37 <xsd:complexType>
38 <xsd:sequence>
39 <xsd:element ref="item" minOccurs="1" maxOccurs="unbounded"></xsd:element>
40 </xsd:sequence>
41 </xsd:complexType>
42 </xsd:element>
43
44 <xsd:element name="item">
45 <xsd:complexType>
46 <xsd:sequence>
47 <xsd:element ref="productName"></xsd:element>
48 <xsd:element ref="quantity"></xsd:element>
49 <xsd:element ref="price"></xsd:element>
50 <xsd:element name="shipDate" type="xsd:date"></xsd:element>
51 </xsd:sequence>
52 <xsd:attribute name="partNum" type="xsd:string" use="required"></xsd:attribute>
53 </xsd:complexType>
54 </xsd:element>
55
56 <xsd:element name="name">
57 <xsd:simpleType>
58 <xsd:restriction base="xsd:string">
59 <xsd:minLength value="0"/>
60 <xsd:maxLength value="50"/>
61 </xsd:restriction>
62 </xsd:simpleType>
63 </xsd:element>
64
65 <xsd:element name="phone">
66 <xsd:simpleType>
67 <!-- <xsd:restriction base="xsd:integer">
68 <xsd:minInclusive value="13000000000"></xsd:minInclusive>
69 <xsd:maxInclusive value="19999999999"></xsd:maxInclusive>
70 </xsd:restriction> -->
71 <xsd:restriction base="xsd:string">
72 <xsd:minLength value="11"></xsd:minLength>
73 <xsd:maxLength value="11"></xsd:maxLength>
74 <xsd:pattern value="1[3-9]{1}[0-9]{9}"></xsd:pattern>
75 </xsd:restriction>
76 </xsd:simpleType>
77 </xsd:element>
78
79 <xsd:element name="productName">
80 <xsd:simpleType>
81 <xsd:restriction base="xsd:string">
82 <xsd:maxLength value="50"/>
83 </xsd:restriction>
84 </xsd:simpleType>
85 </xsd:element>
86
87 <xsd:element name="quantity">
88 <xsd:simpleType>
89 <xsd:restriction base="xsd:integer">
90 <xsd:minInclusive value="1" />
91 </xsd:restriction>
92 </xsd:simpleType>
93 </xsd:element>
94
95 <xsd:element name="price">
96 <xsd:simpleType>
97 <xsd:restriction base="xsd:float">
98 <xsd:minInclusive value="0.1"></xsd:minInclusive>
99 </xsd:restriction>
100 </xsd:simpleType>
101 </xsd:element>
102 </xsd:schema>

orders.xsd

验证xml文件有效性的Java文件:

 1 import java.io.File;
2
3 import javax.xml.transform.stream.StreamSource;
4 import javax.xml.validation.Schema;
5 import javax.xml.validation.SchemaFactory;
6 import javax.xml.validation.Validator;
7
8 import org.xml.sax.SAXException;
9 import org.xml.sax.SAXParseException;
10 import org.xml.sax.helpers.DefaultHandler;
11
12 public class TestXSD {
13
14 public static void main(String[] args) {
15 // TODO Auto-generated method stub
16 File xsdfile = new File("orders.xsd");
17 File xmlfile = new File("orders.xml");
18 Handler errorHandler = null;
19 try {
20 SchemaFactory schemaFactory = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
21 Schema schema = schemaFactory.newSchema(xsdfile);
22 Validator validator = schema.newValidator();
23 errorHandler = new Handler();
24 validator.setErrorHandler(errorHandler);
25 validator.validate(new StreamSource(xmlfile));
26 } catch (Exception e) {
27 System.out.println(e);
28 }
29 if (errorHandler.errorMessage == null) {
30 System.out.println("XML 文件:" + xmlfile.getName()+"符合模式");
31 } else {
32 System.out.println("XML 文件:" + xmlfile.getName()+"不符合模式");
33 }
34 }
35 }
36
37 class Handler extends DefaultHandler {
38 String errorMessage = null;
39
40 public void error(SAXParseException e) throws SAXException {
41 errorMessage = e.getMessage();
42 int row = e.getLineNumber();
43 int colums = e.getColumnNumber();
44 System.out.println("一般错误"+errorMessage+"位置:"+row+","+colums);
45 }
46
47 public void fatalError(SAXParseException e) throws SAXException {
48 errorMessage = e.getMessage();
49 int row = e.getLineNumber();
50 int colums = e.getColumnNumber();
51 System.out.println("致命错误"+errorMessage+"位置:"+row+","+colums);
52 }
53 }

TestXSD.java

检查dtd和Xschema文件限制下的xml文件是否符合的Java文件的更多相关文章

  1. 怎么统计指定文件夹下含有.xml格式的文件数目

    如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...

  2. spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录。如果不放置在根目录下,将会提示 no mybatis mapper was found

    spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录.将会将同一目录下的包扫描成bean. 如果不放置在根目录下,将会提示 no mybatis map ...

  3. Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹

    Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹     1.将一个文件夹下的所有内容复制到另一个文件夹下 cp -r /home/packageA/* /home/cp/packageB ...

  4. Eclipse 下如何引用另一个项目的Java文件

    有关联的2个项目,有些类是相同的.例如实体类. 如果你采用 Ctrl + C & Ctrl + V 的方式,以后再有改动,2个项目就都需要改动. 怎样才能只改动一个呢? 答案就是,在一个项目( ...

  5. 动手动脑-------找出指定文件夹下所有扩展名为.txt和.java的文件

    思路:首先向获取文件,如果是文件的话,则判断它是否以".txt"或".java"结尾,如果是则输出它的路径.如果是文件夹的话,则需获取子文件,利用递归方法遍历子 ...

  6. IDEA将Maven项目中指定文件夹下的xml等文件编译进classes

    eclipse下面创建的Maven项目,使用mybatis.eclipse里面能正常启动,在idea中一直卡在maybatis 加载位置. 1.首先是不报错也没反应.这个时候需要我们重写SqlSess ...

  7. Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件

    //生成一个文件对象: File file = new File(getClass().getClassLoader().getResource("test.xml").getPa ...

  8. 脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)

    问题描述: 由于有一次工作原因,就是将某个文件夹下的所有图片,通过CSS描述他们的属性,用的时候就可以直接引用.但是我觉得那个文件夹下的图片太多,而且CSS文件的格式又有一定的规律,所有想通过脚本来生 ...

  9. IO流的练习3 —— 复制多级文件夹下的指定文件并改名

    需求:复制指定目录下的指定文件,并修改后缀名. 指定的文件是:.java文件. 指定的后缀名是:.jad 数据源所在文件夹:C:\Users\Administrator\Desktop\记录 目的地所 ...

随机推荐

  1. 深入理解Java并发框架AQS系列(一):线程

    深入理解Java并发框架AQS系列(一):线程 深入理解Java并发框架AQS系列(二):AQS框架简介及锁概念 一.概述 1.1.前言 重剑无锋,大巧不工 读j.u.c包下的源码,永远无法绕开的经典 ...

  2. springBoot高级:自动配置分析,事件监听,启动流程分析,监控,部署

    知识点梳理 课堂讲义 02-SpringBoot自动配置-@Conditional使用 Condition是Spring4.0后引入的条件化配置接口,通过实现Condition接口可以完成有条件的加载 ...

  3. MySQL5.7和MySQL8.0通用配置文件

    MySQL5.7 my.cnf配置 [client] port=3306 socket=/log/mysql/mysql.sock [mysql] socket=/log/mysql/mysql.so ...

  4. Dynamics CRM新加了组织后提示数据加密错误的解决方法

    新加组织后登录报错如下: 这个是因为你新还原的组织原来绑定的加密GUID和现有的组织冲突导致的,所以需要重新为数据加密绑定一个GUID 解决办法:随机生成一个GUID 可以在https://guidg ...

  5. 逆向初级-PE(五)

    5.1.PE文件结构 1.什么是可执行文件? 可执行文件(executable fle)指的是可以由操作系统进行加载执行的文件. 可执行文件的格式: Windows平台: PE(Portable Ex ...

  6. Nginx的进程管理与重载原理

    目录 进程结构图 信号量管理 Linux的信号量管理机制 利用信号量管理Nginx进程 配置文件重载原理 进程结构图 Nginx是多进程结构,多进程结构设计是为了保证Nginx的高可用高可靠,包含: ...

  7. Firefox 启动带有配置信息

    若不设置进行下述配置,那么 webdriver 每次启动火狐浏览器,默认都是一个不太有任何插件的浏览器被启动. 通过配置的方式,指定一个浏览器设置来启动,就可以使用以前安装的插件或配置信息了. 步骤一 ...

  8. 号外号外!DevUI Admin V1.0 发布啦!

    4月是鸟儿的月份,是木棉花的月份,是 DevUI Admin 发布的月份. 广受大家期待的 DevUI Admin 终于迎来了第一个开源 Angular 版本! DevUI Admin 是一个企业级中 ...

  9. BLE链路层空中包格式

    空中包格式 BLE链路层的空中包格式非常简单,它所有的空中包都遵循下图所示的格式: 有上图可见,BLE空中包由4个部分组成,他们分别是: 前导码(Preamble) 访问地址(Access Addre ...

  10. 某大佬的TODOLIST

    回文串 manacher(完成时间:2018.12.10)回文串计数最长双回文串(完成时间:2018.12.10) 扫描线 棋盘制作巨大的牛棚玉蟾宫某个blog 汉诺塔相关 新汉诺塔SHOI 博弈论 ...