一、schema约束
- dtd语法:
<!ELEMENT 元素名称 约束>
- schema符合xml的语法,xml语句
- 一个xml中可以有多个schema,多个schema使用名称空间区分,如Java的包名
- dtd里面有PCDATA类型,但是在schema里面可以支持多种数据类型(如 年龄,只能是整数,但schema可以定义一个整数类型)
- 语法更复杂,不能替代dtd
二、快速入门
w3c提供了属性和标签—>创建schema文件(.xsd)—>约束xml文件
根结点的名称为Schema
1,简单元素和复杂元素
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
2,被约束文件中,如xml,引入约束文件
<person
//解释如下:xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
--表示xml是一个被约束文件
xmlns="http://www.example.org/1"
--表示约束文档里面的targetNamespace,url地址
xsi:schemaLocation="http://www.example.org/1 1.xsd">
--targetNamespace 空格 约束文档的地址路径
3.标签和属性
sequence:表示元素出现的顺序
all:元素只能出现一次
choice:只能出现其中一个
any:表示任意元素
maxOccurs=“unbounded” 表示出现次数没限制
<element name="name" type="double" maxOccurs="unbounded"/>
定义属性(必须是复杂元素):(写在 /complexType>之前)
use=”required”属性是否必须出现
<attribute name="p1" type="string" use="required"></attribute>
<!-- 数据文件 引用多个Schema -->
<company xmlns = "http://www.example.org/company"
xmlns:dept="http://www.example.org/department"
xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/company company.xsd http://www.example.org/department department.xsd"
>
<employee age="30">
<!-- 部门名称 -->
<dept:name>人力资源部</dept:name>
<!-- 员工名称 -->
<name>王晓晓</name>
</employee>
</company>
4.sax解析原理
- 解析xml两种技术dom和sax
- 根据xml 的层级结构在内存中分配一个树形结构
- 把xml中标签,属性,文本封装成对象
- sax方式:事件驱动,边读边解析
- 在javax.xml.parsers包里面
SAXParser
此类的实例,从SAXParserFactory.newSAXParser();获得
paser(File f,DefaultHandler dh)
其中第一个参数:xml路径
第二个参数:事件处理器(把。。传递进来,相当于在方法里绑定了一个事件)自动执行事件SAXParserFactory
实例newInstance()方法得到
过程:
解析到开始标签,startElement方法,参数qName:返回标签名称
文本内容,characters方法,通过string构造方法,返回内容
结束标签,endElement方法,参数qName,返回标签名称
5.使用jaxp的sax方式解析xml
sax方式,不能增删改,只能查询操作
1.创建解析器工厂
2.创建解析器
3.执行parse方法
4.自己创建一个类,继承DefaultHandler
5.重写类里面的三个方法
- 获取所有name的值
定义一个成员变量boolean flag=false;
判断开始方法是否是name元素,如果是,flag=true;
如果flag=true时,打印出来里面的内容
结束方法里,再设置成flag=false;
- 获取第一个name元素值
定义一个成员变量 idx=1;
结束的时候,idx++;
character内容输出里面,判断flag==true && idx==1;