1、schema约束
dtd语法:<!ELEMENT 元素名称 约束>
schema符合xml的语法,xml语句
一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)
dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
年龄是整数,schema里面可以直接定义成整数类型
schema语法更为复杂,不能替代dtd
2、schema快速入门
创建一个schema文件 后缀名是 .xsd
根节点<schema>
在schema文件里
属性
xmlns="http://www.w3.org/2001/XMLSchema"
表示当前xml文件是一个约束文件
targetNamespace="http://www.example.org/1"
使用schema约束文件,直接通过这个地址引入约束文件
elementFormDefault="qualified">
质量良好的
步骤
(1)看xml中有多少个元素
<element>
(2)看见简单元素和复杂元素
复杂元素
<complexType>//表示复杂类型
<sequence>//表示有顺序
子元素
</sequence>
</complexType>
简单元素
<sequence>
子元素
</sequence>
(3)在被约束文件里面引入约束文件
<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">
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
表示是一个xml是一个被约束的文件
xmlns="http://www.example.org/1"
是约束文档里面targetNamespace
xsi:schemaLocation="http://www.example.org/1 1.xsd">
名称空间
targetNamespace 空格 约束文档的地址路径
<sequence>:表示元素的出现的顺序
<all>:元素只能出现一次
<choice>:元素只能出现其中的一个
maxOccurs="unbounded":表示元素的出现次数
<any></any>:表示任意元素
可以约束属性
写在复杂元素里面
写在</complexType>之前
<attribute name="id1" type="int" use="required"></attribute>
name:属性名称
type:属性类型
use:属性是否必须出现required
引入多个schema文件,可以给每个起一个别名
3、sax解析的原理
解析xml有两种技术dom和sax
根据xml的层级结构在内存中分配一个树形结构
把xml中标签,属性,文本封装成对象
sax方式:事件驱动,边读边解析
在javax.xml.parsers包里面
SAXParser:
实例可以从SAXParserFactory.newSAXParser()方法获得。
parse(File f, DefaultHandler dh)
两个参数
第一个参数:xml的路径
第二个:事件处理器
SAXParserFactory:
实例newInstance() 方法得到
当解析到开始标签时候,自动执行
startElement(String uri, String localName, String qName, Attributes attributes)
当解析到文本时候,自动执行
endElement(String uri, String localName, String qName)
当解析到结束标签时候,自动执行
characters(char[] ch, int start, int length)
4、使用jaxp的sax方式解析xml
sax方式不能实现增删改操作,只能做查询操作
打印出整个文档
执行parse方法,第一个参数xml路径,第二个参数是事件处理器
创建一个类,继承事件处理器的类
重写里面的三个方法
获取到所有name元素的值
获取第一个name元素的值
5、使用dom4j解析xml
dom4j不是javase的一部分
导入dom4j提供jar包
得到document
SAXReader reader = new SAXReader();
Document document = reader.read(url);
return document;
document的父接口是Node
如果在document里面找不到方法,就到Node里面去找
document里面的方法
getRootELement():获取根节点
返回的是Element
Element也是一个接口,父接口是Node
6、使用dom4j查询xml
查询所有name元素里面的值
/*
1、创建解析器
2、得到document
3、得到根节点getRootELement
4、得到所有p1标签
element(qname)
表示获取标签下面的第一个子标签
qname:标签名称
elements(qname)
获取标签下面是这个名称的所有子标签(一层)
elements()
获取标签下面的所有一层子标签
5、得到name
6、得到name里面的值
*/
查询第一个name元素的值
获取第二个name元素的值
7、使用dom4j实现添加操作
8、在特定位置添加元素
在一个p1下面的age之前添加school
可以对得到document的操作和回写xml操作,封装成方法
也可以把传递的文件路径,封装成一个常量
好处:可以提高开发速度,可以提高代码可维护性
9、使用dom4j实现修改节点操作
修改第一个p1下面age的值为30
10、使用dom4j实现删除节点操作
删除第一个p1下面的school
11、使用dom4j获取属性的操作
获取第一个p1里面的属性id1的值
12、使用dom4j支持xpath的操作
可以直接获取到某个元素
第一种形式
/AAA/BBB/DDD:一层一层的
第二种形式
//BBB:表示和这个名称相同都可以得到
第三种形式
/*:所有元素
第四种形式
BBB[1]:第一个
BBB[last()]:最后一个
第五种形式:
//BBB[@id]: 表示只要BBB元素上面有id属性,都可以得到
第六种形式:
//BBB[@id="b1"]
13、使用dom4j支持xpath具体操作
默认情况下,dom4j不支持xpath
第一步,引入jar包
在里面有两个方法,来支持xpath
selectNodes("xpath表达式")
获取多个节点
selectSingleNodes("xpath表达式")
获取一个节点
使用xpath实现
查询所有name元素里面的值
//name
获取第一个p1下面的name值
//p1[@id1='aaa']/name
14、实现简单的学生管理系统
使用xml当作数据,存储学生信息
创建一个xml文件,写一些学生信息
增加操作
删除操作
查询操作
schema约束
最新推荐文章于 2022-07-21 10:11:12 发布