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 删除
再次运行会报错