JavaWeb学习笔记06-xml

1、schema约束
dtd语法: <!ELEMENT 元素名称 约束>
** schema符合xml的语法,xml语句
** 一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包)
** dtd里面有PCDATA等类型,但是在schema中可以支持更多的数据类型
如:年龄只能是整数,在schema可以直接定义一个整数类型。
** schema语法更加复杂,schema目前不能代替dtd
2、schema的快速入门
* 创建一个i额schema文件 后缀名是 .xsd
** 根节点 <schema>
* 在schema文件里面
** 属性 xmlns = "http://www.w3.org/2001/XMLSchema"
- 表示当前xml文件是一个约束文件
** targetNamespace="url地址"
- 使用schema约束文件,直接通过这个地址引入约束文件
** elementFormDefault="qualified"
步骤
(1)看xml中有多少个元素
<element>
(2)看简单元素和复杂元素
复杂元素
<complexType>
<sequence>
子元素
</sequence>
</complexType>
(3)简单元素写在复杂元素的sequence里面
子元素 <element name="name" type="元素类型"></element>
(4)在被约束文件(xml)中引入约束文件
<person xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance">
- 表示xml是一个被约束文件
<xmlns="url地址">
- 是约束文档里面的targetNamespace
xsi:schemaLocationn="url地址 约束文件名"
- targetNamespace 空格 约束文挡的地址路径
//由于xmlns重名需要区分,所以用xmlns:xsi区分

* <sequence> 表示元素的出现的顺序
 <all> 元素只能出现一次
 <choice> 元素只能出现其中的一个
 maxOccurs="undounded" 表示元素的出现的次数
 
 * 可以约束属性
* 写在复杂元素里面
* 写在</complexType>之前
<attribute name="id" type="int" use="required"></attribute>
name 属性名称
type 属性类型
use 属性是否必须出现 required

3、sax解析的原理
* 解析xml有两种技术 dom和sax
dom:根据xml的层级结构在内存中分配一个树形结构
把xml中标签 属性 文本封装成对象
sax:事件驱动,边读边解析

* 在javax.xml.parsers包里面
SAXParser
此类实例可以从SAXParserFactory.newSAXParser()方法获得
parse(File f,DefaultHandler dh)
第一个参数为xml的路径,第二个参数为事件处理器
SAXParserFactory
实例 newInstance()方法得到
* sax执行过程
* 当解析到开始标签时候,自动执行startElement方法
* 当解析到文本时候,自动执行characters方法
* 当解析到结束标签时候,自动执行endElement方法

4、使用jaxp的sax方式解析xml
* sax方式不能实现增删改操作,只能执行查找操作。
** 打印出整个文档
** 执行parse方法,第一个参数为xml路径,第二个参数为事件处理器
** 创建一个类(继承事件处理器的类)
** 重写sax执行过程的三个方法

** 过程
1、创建解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
2、创建解析器
SAXParser saxParser = saxParserFactory.newSAXParser();
3、执行parse方法
saxParser.parse("src/*.xml",dh);
4、创建一个类,继承DefaultHandler
class myHandler extends DefaultHandler{
//右键->source->override,重写三个方法
public void statrElement(){}
public void characters(){}
public void endElement(){}
}

5、重写类里面的三个方法

5、使用dom4j解析xml
* dom4j 是一个组织,针对xml解析,提供解析器 dom4j
* dom4j 不是javase的一部分
* 使用方法:
* 导入dom4j的包 buildpath——>add to build path
* 得到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()
获取标签下面的所有子标签(一层)

6、使用dom4j查询xml
<?xml version="1.0" enCoding="UTF-8"?>//创建路径为src下面的name.xml
<person>
<p1>
<name>tough</name>
<age>21</age>
</p1>
<p1>
<name>sarah</name>
<age>20</age>
</p1>
</person>
*查询所有name元素里面的值
步骤:
1、创建解析器
2、得到decument
3、得到根节点 
getRootElement 返回Element
4、得到所有的p1
elements("p1") 返回list集合
遍历list得到每一个p1
5、得到name
在p1下面执行 element("name")方法 返回Element
6、得到name里面的值
getText方法得到值
代码:
SAXReader saxReader = new SAXReader();
Document document = saxReader.read("src/name.xml"); //得到document
Element root = document.getRootElement(); //得到根节点
List<Element> list = root.elements("p1"); //得到p1
for(Element element:list){ //遍历list
Element name1= element.element("name");
String s = name1.getText();
System.out.println(s);
}

7、使用dom4j实现添加操作
* 在第一个p1标签末尾添加一个元素 <sex></sex>
步骤:
1、创建解析器
SAXReader saxReader = new SAXReader();
2、得到document
Document document = saxReader.read("src/name.xml");
3、得到根节点
Element root = document.getRootElement();
4、获取第一个p1
Element p1 = root.element("p1");
5、在p1下面添加元素
Element sex1 = p1.addElement("sex");
6、在添加完成之后的元素下面添加文本
sex1.setText("girl");
7、回写xml
OutputFormat format = OutputFormat.createPrettyPrint();//有缩进的效果
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/name.xml"),format);
xmlWriter.write(document);
xmlWriter.close();

8、在特定位置添加元素
* 在第一个p1下面的age标签前面添加一个<school></school>
步骤:
1、创建解析器
SAXReader saxReader = new SAXReader();
2、得到document
Document document = saxReader.read("src/name.xml");
3、得到根节点
Element root = document.getRootElement();
4、获取第一个p1
List<Element> list = root.elements("p1");
5、获取p1下面的所有元素
** elements()方法返回list集合
  使用list里面的方法,在特定位置添加元素
add(int index,E element)
- 第一个参数是位置下标,从0开始
- 第二个参数是要添加的元素
Element school = DocumentHelper.createElement("school");
school.setText("CTBU");
list.add(1,school);

6、回写xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/name.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
 
9、使用dom4j实现修改节点的操作
* 修改第一个p1下面的age元素的值
步骤:
1、创建解析器
SAXReader saxReader = new SAXReader();
2、得到document
Document document = saxReader.read("src/name.xml");
3、得到根节点
Element root = document.getRootElement();
4、获取第一个p1
Element p1 = root.element("p1");
5、得到p1下面的age
Element age = p1.element("age");
6、修改age
age.setText("18");
7、回写xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/name.xml"),format);
xmlWriter.write(document);
xmlWriter.close();

10、使用dom4j实现删除节点的操作
* 删除第一个p1节点下面的<school>
步骤:
1、创建解析器
SAXReader saxReader = new SAXReader();
2、得到document
Document document = saxReader.read("src/name.xml");
3、得到根节点
Element root = document.getRootElement();
4、获取第一个p1
Element p1 = root.element("p1");
5、获取school元素
Element sch = p1.element("school");
6、删除元素
p1.remove("sch");
7、回写xml
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/name.xml"),format);
xmlWriter.write(document);
xmlWriter.close();

11、使用dom4j获取属性
步骤:
1、创建解析器
SAXReader saxReader = new SAXReader();
2、得到document
Document document = saxReader.read("src/name.xml");
3、得到根节点
Element root = document.getRootElement();
4、获取第一个p1
Element p1 = root.element("p1");
5、得到p1的属性值
p1.attributeValue("id1");

12、使用dom4j支持xpath的操作
* 可以直接获取到某个元素

* 第一种形式
/AAA/DDD/BBB 表示一层一层的,AAA下面的DDD下面的BBB
* 第二种形式
//BBB 表示和这个名称相同,只要名称是BBB,都得到
* 第三种形式
/* 表示所有元素
* 第四种形式
BBB[1] 表示第一个BBB元素
BBB[last()] 表示最后一个BBB元素
* 第五种形式
//BBB[@id] 表示只要BBB元素上面有id属性,都得到
* 第六种形式
//BBB[@id='b1'] 表示元素名称是BBB,在BBB上有id属性,且id的属性值是'b1'

13、使用dom4j支持xpath具体操作
* 默认情况下,dom4j不支持xpath
* 使用方法:
** 引入支持xpath的jar包,使用javen-1.1-beta-6.jar
* 在dom4j里面提供了两个方法,用来支持xpath
selectNodes("xpath表达式")
- 获取多个节点
seleectSingleNode("xpath表达式")
- 获取一个节点








 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值