一、schema简介
1.schema符合xml的语法,它是一个xml文件
2.一个xml中只能有一个dtd文件,但是可以有多个schema,通过名称空间来区分(类似于JAVA中的包)
3.dtd中有#PCDATA类型,即String,但是schema中可以有多种类型(int double 等等)
4.schema的出现时为了破除dtd的局限性,但是其语法比较复杂,现在还不能代替dtd
二、schema的快速入门
1.创建一个schema文件,名字为.xsd,里面的根节点为<schema></schema>
2.在schema文件里面
<schema xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/1"
xmlns:tns="http://www.example.org/1"
elementFormDefault="qualified">
</schema>
—属性:表示当前xml文件是一个schema约束文件
xmlns="http://www.w3.org/2001/XMLSchema"
—使用schema文件,直接通过该地址引入约束文件,保证没有重复的,地址可以自己定义
targetNamespace="http://www.example.org/1"
—质量良好
elementFormDefault="qualified">
三、看有多少的元素
区分简单元素和复杂元素
如果是复杂元素
<element name="person">
<complexType>
<sequence>
</sequence>
</complexType>
</element>
简单元素,写入到复杂元素里
<element name="person">
<complexType>
<sequence>
<element name="name"></element>
<element name="age"></element>
</sequence>
</complexType>
</element>
<sequence></sequence>:表示元素只能按照里面的顺序出现
<all></all>:元素只能出现一次
<choice></choice>:元素只能出现一个
<any><any>:表示可以写任意属性
其中的属性:maxOccurs="unbounded":表示元素出现的次数
<element name="name" maxOccurs="unbounded"></element>
定义属性:必须写是复杂元素里,写在</complexType>
上面。
<attribute name="id1" type="int" use="required"></attribute>
</complexType>
定义的这个id1要写在person中
name:定义属性名称
type:定义属性类型
use:属性是否必须要出现
四、在xml中引入schema文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.example.org/1"
xsi:schemaLocation="http://www.example.org/1 1.xsd">
—表示xml是一个被约束文件,xsi表示包名,可以随便写
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
—是约束文档中的targetNamespace,引入的文档的地址
xmlns="http://www.example.org/1"
—targetNamespace 空格 结束文档的路径地址
xsi:schemaLocation="http://www.example.org/1 1.xsd">
引入多个schema,可以个schema起别名,如果使用部门的属性,可以用部门的schema别名:属性
<dept:name>aa</dept:name>
五、sax解析原理(事件驱动,边读边解析)
1.在java.xml.parsers包中
SAXParser:此类的实例可以从SAXParserFactory.newSAXParser()方法获得,该类的方法:parse(File f,DefultHandler dh):第一个参数:xml的路径,第二个参数:事件处理器
SAXParserFactory:实例通过newInstance()得到。
2.sax的执行过程
执行parse方法的时候,当把事件处理器传进去的时候,相当于在方法中绑定了一个事件。然后自动执行事件。事件处理器是默认传进去的。
当解析到开始标签的时候,自动执行startElement()方法
当解析到文本的时候,自动执行characters()方法
当解析到结束标签的时候,自动执行endElement()方法