Schema技术

Schema 技术

Schema 是 DTD 的代替者,名称为 XML Schema,用于描述XML 文档结构,即对XML文档做出规范,比 DTD 更加强大,最主要的特征之一就是XML Schema 支持数据类型。 Schema,提纲;提要

1) Schema 是用 XML 验证 XML 遵循的语法
2) Schema 可以用能处理 XML 文档的工具处理
3) Schema 大大扩充了数据类型,而且还可以自定义数据类型

4) Schema 支持元素的继承

5) Schema 支持属性组

 

创建验证文件

 

所有的 Schema 文档使用 schema 作为其根元素

http://www.w3.org/2001/XMLSchema:用于验证当前 Schema文档的命名空间(用于验证Schema本身)同时它还规定了来自

命名空间 http://www.w3.org/2001/XMLSchema 的元素和数据类型应该使用前缀 xs:

xmlns 相当于 java 中的 import, :xs

在使用时要写加“小名”做前缀

(XML 使用 Schema 验证,那 Schema 也是一个 XML,谁来
验证它?DTD)

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
 3     <!-- element元素  根元素名字叫做books -->
 4     <xs:element name="books">
 5         <!-- books类型是复杂数据类型,包含其他元素,复杂数据类型用complexType -->
 6         <xs:complexType>
 7             <!-- sequence序列,按照顺序来编写 -->
 8             <xs:sequence>
 9                 <!-- alt+/ 补全   第一个元素名字是book maxOccurs为最多可以出现几个 unbounded为不绑定,即不限制出现多少次 -->
10                 <xs:element name="book" maxOccurs="unbounded">
11                     <!-- book包含name author等,也是一个复合类型 -->
12                     <xs:complexType>
13                         <!-- 子标签出现有一定的顺序 -->
14                         <xs:sequence>
15                             <!-- book中的第一个子元素 名字:name 类型:string  name中没有其他元素了,是简单类型 -->
16                             <xs:element name="name" type="xs:string"></xs:element>
17                             <xs:element name="author" type="xs:string"></xs:element>
18                             <xs:element name="price" type="xs:double"></xs:element>
19                         </xs:sequence>
20                         <!-- book有一个属性  名字:id 类型:int 属性是否必写:必写-->
21                         <xs:attribute name="id" type="xs:positiveInteger" use="required"></xs:attribute>
22                     </xs:complexType>
23                 </xs:element>
24             </xs:sequence>
25         </xs:complexType>
26     </xs:element>
27 </xs:schema>

 

把验证文件引入到xml文件中,验证xml文档是否正确

<?xml version="1.0" encoding="UTF-8"?>
<books xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="{books.xsd}"> <!-- 引入验证文件 -->
    <book id="1001">
        <name>java程序设计</name>
        <author>菜鸟教程</author>
        <price>30</price>
    </book>
</books>

 

如何验证:

1) 创建 SchemaFactory 工厂

2) 建立验证文件对象

3) 利用 SchemaFactory 工厂对象,接收验证的文件对象,生成 Schema 对象

4) 产生对此 schema 的验证器

5) 要验证的数据(准备数据源)

6) 开始验证

 

 1 import java.io.File;
 2 import java.io.IOException;
 3 
 4 import javax.xml.transform.stream.StreamSource;
 5 import javax.xml.validation.Schema;
 6 import javax.xml.validation.SchemaFactory;
 7 import javax.xml.validation.Validator;
 8 
 9 import org.xml.sax.SAXException;
10 
11 public class Test {
12 
13     public static void main(String[] args) throws SAXException {
14         //1) 创建 SchemaFactory 工厂
15         SchemaFactory sch = SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
16         //2) 建立验证文件对象
17         File schemaFile = new File("books.xsd");
18         //3) 利用 SchemaFactory 工厂对象,接收验证的文件对象,生成 Schema 对象
19         Schema schema = sch.newSchema(schemaFile);
20         //4) 产生对此 schema 的验证器
21         Validator validator = schema.newValidator();
22         //5) 要验证的数据(准备数据源)
23         StreamSource source = new StreamSource("book.xml");
24         //6) 开始验证
25         try {
26             validator.validate(source);
27             System.out.println("正确");
28         } catch (IOException e) {
29             // TODO 自动生成的 catch 块
30             e.printStackTrace();
31             System.out.println("错误");
32         }
33     }
34 
35 }

book.xml  和books.xsd文件要放在项目下面

 

 运行

试着改动book.xml,把book标签的属性 id 删除

再次运行会报错

 

posted @ 2019-04-30 14:56  北风吹沙  阅读(1096)  评论(0编辑  收藏  举报