检查dtd和Xschema文件限制下的xml文件是否符合的Java文件
先来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文件的更多相关文章
- 怎么统计指定文件夹下含有.xml格式的文件数目
如何统计指定文件夹下含有.xml格式的文件数目?如题 ------解决思路----------------------Directory.GetFiles(@"路径", " ...
- spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录。如果不放置在根目录下,将会提示 no mybatis mapper was found
spring boot 启动类一定要放置到包的根目录下,也就是和所有包含java文件的包在同一级目录.将会将同一目录下的包扫描成bean. 如果不放置在根目录下,将会提示 no mybatis map ...
- Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹
Linux将一个文件夹或文件夹下的所有内容复制到另一个文件夹 1.将一个文件夹下的所有内容复制到另一个文件夹下 cp -r /home/packageA/* /home/cp/packageB ...
- Eclipse 下如何引用另一个项目的Java文件
有关联的2个项目,有些类是相同的.例如实体类. 如果你采用 Ctrl + C & Ctrl + V 的方式,以后再有改动,2个项目就都需要改动. 怎样才能只改动一个呢? 答案就是,在一个项目( ...
- 动手动脑-------找出指定文件夹下所有扩展名为.txt和.java的文件
思路:首先向获取文件,如果是文件的话,则判断它是否以".txt"或".java"结尾,如果是则输出它的路径.如果是文件夹的话,则需获取子文件,利用递归方法遍历子 ...
- IDEA将Maven项目中指定文件夹下的xml等文件编译进classes
eclipse下面创建的Maven项目,使用mybatis.eclipse里面能正常启动,在idea中一直卡在maybatis 加载位置. 1.首先是不报错也没反应.这个时候需要我们重写SqlSess ...
- Java web 项目读取src或者tomcat下class文件夹下的xml文件或者properties文件
//生成一个文件对象: File file = new File(getClass().getClassLoader().getResource("test.xml").getPa ...
- 脚本工具(获取某个文件夹下的所有图片属性批量生成css样式)
问题描述: 由于有一次工作原因,就是将某个文件夹下的所有图片,通过CSS描述他们的属性,用的时候就可以直接引用.但是我觉得那个文件夹下的图片太多,而且CSS文件的格式又有一定的规律,所有想通过脚本来生 ...
- IO流的练习3 —— 复制多级文件夹下的指定文件并改名
需求:复制指定目录下的指定文件,并修改后缀名. 指定的文件是:.java文件. 指定的后缀名是:.jad 数据源所在文件夹:C:\Users\Administrator\Desktop\记录 目的地所 ...
随机推荐
- Elasticsearch 单字符串多字段查询
前言 有些时候,我们搜索的时候,只会提供一个输入框,但是会查询相关的多个字段,典型的如Google搜索,我们该如何用 Elasticsearch 如何实现呢? 实例 从单字符串查询的实例说起 创建测试 ...
- 使用Webpack构建多页面程序
使用webpack搭建单页面程序十分常见,但在实际开发中我们可能还会有开发多页面程序的需求,因此我研究了一下如何使用webpack搭建多页面程序. 原理 将每个页面所在的文件夹都看作是一个单独的单页面 ...
- 精通模块化JavaScript
近日读了一本名为<精通模块化JavaScript>的书,并记录了其中的精髓. 一.模块化思维 精通模块化开发并不是指要遵循一套定义明确的规则,而是指能够将自己置身于使用者的角度,为可能即将 ...
- 解析库--XPath
from lxml import etree 2 text = ''' 3 <div> 4 <ul> 5 <li class = "item-0"&g ...
- PTA 统计二叉树结点个数
6-1 统计二叉树结点个数 (10 分) 本题要求实现一个函数,可统计二叉树的结点个数. 函数接口定义: int NodeCount ( BiTree T); T是二叉树树根指针,函数NodeCo ...
- gstreamer常用命令
由于有好一段时间没做GStreamer相关项目了,早前的一些记录需要做下记录,以待需要的时候查阅. 还是分几个小节来介绍吧,这样思路清晰一点.(格式有点乱,没时间整理,读者自行脑补) 1. 播放视频. ...
- Android Studio 有关 RecycleView 的使用
•导入相关包 右击File->Project Structure: 搜索 com.android.support: 找到 recyclerview: 导入好后 Sync Now 同步一下,到这 ...
- java面试-谈谈你对volatile的理解
一.volatile特性: volatile是Java虚拟机提供的轻量级的同步机制.主要有三大特性: 保证可见性 不保证原子性 禁止指令重排序 1.保证可见性 1)代码演示 AAA线程修改变量numb ...
- mvn 报错 - The POM for <name> is invalid, transitive dependencies (if any) will not be available
核心: 通过 mvn dependency:tree -X 分析依赖解决方案: 解决依赖冲突版本 1. MILGpController 编译突然报错 14:10:28 [ERROR] Failed ...
- 《构建之法》& CI/CD调研
项目 内容 这个作业属于哪个课程 2021春季软件工程(罗杰 任健) 这个作业的要求在哪里 2021年软工-个人阅读作业2 我在这个课程的目标是 提升软件开发能力与团队意识 这个作业在哪个具体方面帮助 ...