schema约束
dtd语法:<!ELEMENT 元素名称 约束>
schema符合xml语法,xml语句
一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)
dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
比如 年龄 只能是整数,在schema可以直接定义一个 整数类型
schema语法更加复杂,schema目前无法替代dtd
schema的快速入门
创建一个schema文件 后缀名是 .xsd
根节点<>
在schema文件里面
属性 xmlns="http://www.w3.org/2001/XMLSchema"
表示当前xml文件是一个约束文件
targetNamespace="http://www.itcast.cn/20151111"
使用schema约束文件,直接通过这个地址引入约束文件
elementFormDefault="qualified"
步骤
1.看xml中有多少个元素
<element>
2.看简单元素和复杂元素
如果复杂元素
<complexType>
<sequence>
子元素
</sequence>
3.简单元素,写在复杂元素的
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
4.在被约束文件里面引入约束文件
<person xmlns:xsi="http://www.w3.org/2011/XMLSchema-instance"
xmlns="http://www.itcast.cn/20151111"
xsi:schemaLocation="http://www.itcast.cn/20151111 1.xsd" >
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
——表示 xml 是一个被约束文件
xmlns="http://www.itcast.cn/20151111 "
——是约束文档里面 targetNamespace
xsi:schemaLocation="http://www.itcast.cn/20151111 1.xsd">
targetNamespace 空格 约束文档的地址路径
<sequence>:表示元素的出现的顺序
<all>:元素只能出现一次
<choice>:元素只能出现其中的一个
maxOccurs="unbounded" 表示元素的出现的次数
<any></any>:表示任何元素
可以约束任何元素
写在复杂元素里面
sax解析的原理
解析xml有两种技术 dom和sax
根据xml的层级结构在内存中分配一个树形结构
把xml中标签,属性,文本封装成对象
sax方式:事件驱动,边读边解析
在java.xml.parsers包里面
SAXParser
此类的实例可以从SAXParserFactory.newSAXParser() 方法获得
parse
SAXParserFactory
实例 newInstance() 方法得到
sax执行过程:
当解析到开始标签时,自动执行starElement方法
当解析到文本时候,自动执行characters方法
当解析到结束标签时,自动执行endElement方法
使用jaxp的sax方式解析
sax方式不能实现增删改操作,只能做查询操作
打印出整个文档
执行parse方法,第一个参数xml路径,第二个参数是 事件处理器
创建一个类,继承事件处理器的类
重写里面的三个方法
获取到所有的name元素的值
定义一个成员变量 flag=false;
判断开始方法是否是name元素,如果是name元素 ,把flag值设置成true
当flag值是true,在characters方法里面打印内容
当执行到结束方法时,把flag值设置成false
获取第一个name元素的值
定义一个成员变量 idx=1;
在结束方法时候, idx+1 idx++
想要打印出第一个name元素的值
在characters方法里面判断
判断flag=true并且 idx==1,在打印内容
使用dom4j解析xml
dom4j,是一个组织,针对xml解析,提供解析器 dom4j
dom4j不是javase的一部分,想要使用第一步需要怎么做
导入dom4j提供jar包
创建一个文件夹lib
复制jar包到lib下面
右键点击jar包 ,bulid path--add to bulidpath
看到jar包, 变成奶瓶样子,表示导入成功
得到document
SAXReader reader=new SAXReader();
Document document=reader.read(url);
document的父接口是Node
如果在document里面找不到想要的方法,到Node里面去找
document里面的方法 getRootElment():获取根节点 返回的是Element
Element也是一个接口,父接口是Node
Element和Node里面方法:
getParent():获取父节点
addElement:添加标签
使用dom4j查询xml
查询所有name元素里面的值
1.创建解析器
2.得到document
3.得到根节点
4.得到所有的p1标签
element(qname)
表示获取标签下面的第一个子标签
qname:标签的名称
elements(qname)
获取标签下面是这个名称的所有子标签(一层)
qname:标签名称
element();
获取标签下面的所有一层子标签
5.得到name
6.得到name里面的值
网友评论