schema简述
- schema符合xml的语法,(也就是一个xml文件)
- 一个xml中可以有多个schema,多个schema使用名称空间区分
- dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
- schema语法更加复杂,schema目前不能替代dtd
schema语法(.xsd):
- 在schema文件里面
属性:
1) xmlns=”http://www.w3.org/2001/XMLSchema”(表示当前xml文件是一个约束文件)
2) targetNamespace=”http://www.itcast.cn/20151111”(随便写,但必须保证唯一,要和被约束文件中的地址相同,直接通过这个地址引入约束文件
3) elementFormDefault=”qualified”- 步骤:
(1)看xml中有多少个元素 ,简单元素和复杂元素
* 如果简单元素直接写
<element
name=”age” type=”int”/>
*如果复杂元素
<complexType>
<sequence>
<element name="age" type="int"/>
</sequence>
</complexType>
(2)简单元素,写在复杂元素的
<element name="person">
<complexType>
<sequence>(表示元素出现的顺序)
<element name="name" type="string"></element>
<element name="age" type="int"></element>
</sequence>
</complexType>
</element>
(3)在被约束文件里面引入约束文件
<person
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>
:表示任意元素
写在</complexType>
之前
<attribute name="id1" type="int" use="required"></attribute>
- name: 属性名称
- type:属性类型 int stirng
- use:属性是否必须出现 required
* 引入多个schema文件,可以给每个起一个别名
<dept:name>100</dept:name>
* 想要引入部门的约束文件里面的name,使用部门的别名 detp:元素名称
SAX解析:
- 事件驱动,边读边解析( 在javax.xml.parsers包里面)
- SAXParser
此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
- parse(File f, DefaultHandler dh)
** 第一个参数:xml的路径
** 事件处理器SAXParserFactory(实例 newInstance() 方法得到)
sax执行过程:
* 当解析到开始标签时候,自动执行startElement方法
* 当解析到文本时候,自动执行characters方法
* 当解析到结束标签时候,自动执行endElement方法重写里面的三个方法
使用dom4j解析XML文件
- dom4j,是一个组织,针对xml解析,提供解析器 dom4j
- 得到document
SAXReader reader = new SAXReader();
Document document = reader.read(url);- document的父接口是Node
如果在document里面找不到想要的方法,到Node里面去找
document里面的方法 getRootElement() :获取根节点 返回的是Element- Element也是一个接口,父接口是Node
- Element和Node里面方法
** getParent():获取父节点
** addElement:添加标签- element(qname)
** 表示获取标签下面的第一个子标签
** qname:标签的名称- elements(qname)
** 获取标签下面是这个名称的所有子标签(一层)
** qname:标签名称- elements()
** 获取标签下面的所有一层子标签
> * 查询所有name元素里面的值
1、创建解析器
2、得到document
3、得到根节点 getRootElement() 返回Element
4、得到所有的p1标签
* elements("p1") 返回list集合
* 遍历list得到每一个p1
5、得到name
* 在p1下面执行 element("name")方法 返回Element
6、得到name里面的值
* getText方法得到值
> * 使用dom4j实现添加操作
步骤:
1、创建解析器
2、得到document
3、得到根节点
4、获取到第一个p1
* 使用element方法
5、在p1下面添加元素
* 在p1上面直接使用 addElement(“标签名称”)方法 返回一个Element
6、在添加完成之后的元素下面添加文本
* 在sex上直接使用 setText(“文本内容”)方法
7、回写xml
* 格式化 OutputFormat,使用 createPrettyPrint方法,表示一个漂亮的格式
* 使用类XMLWriter 直接new 这个类 ,传递两个参数
* 第一个参数是xml文件路径 new FileOutputStream(“路径”)
* 第二个参数是格式化类的值
使用dom4j实现在特定位置添加元素
步骤:
1、创建解析器
2、得到document
3、得到根节点
4、获取到第一个p1
5、获取p1下面的所有的元素
elements()方法 返回 list集合
使用list里面的方法,在特定位置添加元素
首先创建元素 在元素下面创建文本
使用DocumentHelper类方法createElement创建标签
把文本添加到标签下面 使用 setText(“文本内容”)方法
list集合里面的 add(int index, E element)
第一个参数是 位置 下标,从0开始
第二个参数是 要添加的元素
使用dom4j实现修改节点的操作
步骤:
1、得到document
2、得到根节点,然后再得到第一个p1元素
3、得到第一个p1下面的age
element(“”)方法
4、修改值是 30
使用setText(“文本内容”)方法
5、回写xml
使用dom4j实现删除节点的操作
1、得到document
2、得到根节点
3、得到第一个p1标签
4、得到第一个p1下面的school元素
5、删除(使用p1删除school)
得到school的父节点
- 第一种直接得到p1
- 使用方法 getParent方法得到
* 删除操作
- 在p1上面执行remove方法删除节点
6、回写xml
使用dom4j获取属性的操作
步骤:
1、得到document
2、得到根节点
3、得到第一个p1元素
4、得到p1里面的属性值
- p1.attributeValue("id1");
- 在p1上面执行这个方法,里面的参数是属性名称