1、schema约束
schema基础:
1)schema符合xml的语法,xml语句
dtd语法: <!Element 元素名称 约束>
2)一个xml中可以有多个schema,
多个schema使用名称空间区分(类似于java包名)
3)schema里面可以支持更多的数据类型,并支持用户自定义新的数据类型
dtd里面有PCDATA类型
2、schema快速入门
创建一个schema文件 后缀名 .sxd
xmlns="http://www.w3.org/2001/XMLSchema"
表示文件是 XMLSchema文件
targetNamespace="http://www.example.org/1"
表示使用schema约束文件,通过此地址引入约束文件
xmlns:tns="http://www.example.org/1"
elementFormDefault="qualified">
步骤:
1)看xml中有多少个元素 有几个元素就写几个element
2)看简单元素和复杂元素
复杂元素:
<element name="复杂元素">
<complexType> //声明为复杂类型
<sequence> //有序的 复杂元素指示器,表示为有序的
子元素
子元素
...
</sequence>
</complexType>
</element>
简单元素:写在复杂元素 <sequence>内部
<complexType>
<sequence>
<element name="子元素名称" type="子元素数据类型"></element>
<element name="子元素名称" type="子元素数据类型"></element>
...
</sequence>
</complexType>
3)引入约束文件(在被约束文件里面)
被引入文件根节点属性
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
--表示xsi是被约束文件
解释:
xmlns:xsi : 为xml文件起名为xsi,避免与下面的地址名重复。
"http://www.w3.org/2001/XMLSchema-instance" :"约束文件-instance"
xmlns="http://www.example.org/1"
--地址引用于约束文档的targetNamespace
xsi:schemaLocation="http://www.example.org/1 1.xsd">
解释:
http://www.example.org/1 :约束文件地址
1.xsd : 约束文件名
注:引入多个schema文件时,填写多个地址引入
有多个schema文件时,标签前需声明schema文件地址名
eg: <schema文件地址名: name> aaa </name>
知识点:
1)复杂元素指示器
1)all :表示只出现一次
2)choice : 只出现其中的一个
3)sequence :元素按照顺序出现
4)maxOcurs="unbounded" : 表示出现次数无限制
5)any : 任意元素
2)属性约束:
<attribute> </attribute> 写在复杂元素里面 <complexType>外面
eg:<attribute name="id1" type="int" use="required"> </attribute>
name : 属性名称
type :属性类型
use : 属性必须出现。
3、sax解析原理
sax方式:事件驱动,边读边解析
SAXParser: 解析类 抽象类 通过 SAXParserFactory.newSAXParser()方法得到
方法:
parse(File f , DefaultHandler dh) 两个参数
传参为:xml路径,事件处理器
SAXParserFactory: 解析工厂 抽象类 通过 .newInstance()方法得到工厂实例
sax解析过程
解析到开始标签,执行startElement方法
解析到文本内容,
解析到结束标签,执行endElement方法
4、使用jaxp的sax方式实现查询
(1)打印出整个文档
步骤:
1.创建解析器工厂
//SAXParserFactory saxParseFactory = SAXParserFactory.newInstance();
2.创建解析器
//SAXParser saxParser = saxParseFactory.newSAXParser();
3.执行parse方法
.parse(File f , DefaultHandler dh)
//saxParser.parse("src\\p1.xml", new MyDefaul1());
a.需要创建一个类,继承DefaultHandler类
b.重写类中的三个方法
startElement 重写方法打印出开始标签
characters 重写方法打印出文本
endElement 重写方法打印出结束标签
(2)实现获取所有name的值
在(1)的基础上 分别重写三个方法
boolean flag = false;
startElement //判断name值是否等于返回的标签值
if("name".equals(qName))
flag = true;
characters //当flag == true 打印值
if(flag == true)
System.out.println(new String(ch,start,length));
endElement // 执行到结束方法,把flag再次设为false
if(flag == true)
flag = false;
(3)获得第一个name的值
在(2)的基础上 添加限制
添加 定义 idx = 0;
startElement 是name元素时 idx++;
characters 当idx==1时,打印