java程序员第六课DOM&XML
1、上节内容回顾
* 表单提交方式:
- type=”submit”
- 使用button ,获取form,使用form里面submit()方法
* 事件 onclick onchange onfocus onblur
* xml:可扩展标记型语言(标签是自定义的)
* xml的应用
* xml语法
- 文档声明:放在第一行第一列 <?xml version="1.0" encoding="utf-8"?>
- 元素定义:
** 有开始标签也要有结束标签
** 区分大小写
** 不能以数字下划线 xml.....
- 属性定义
- 转义字符 < > & " ,
- CDATA区:将里面的内容作为字符串,而不是作为标签
- 处理指令:设置xml的样式
* 约束有 dtd 和 schema
* dtd约束
** 格式 <!ELEMENT 元素名称 使用规则>
* 元素的使用规则:
** 简单元素
- (#PCDATA)
- EMPTY
- ANY
**复杂元素
- (name,age,sex):按照顺序出现
- (name|age|sex): 只能出现其中的一个
- name+:一次或者多次
- name*:任意次数
- name?:0次或者1次
* 属性的使用规则
格式:<!ATTLIST 元素名称
属性名称 属性类型 约束
>
** 属性类型
- CDATA
- ID:以字母和下划线开头
- 枚举:每次只能出现范围中的一个
** 约束:
- #REQUIRED
- #IMPLIED
- #FIXED "ABC"
- 直接值 "aaa"
* 在xml中引入dtd(三种)
1、使用内部dtd
2、使用外部的dtd
3、使用公共的dtd
* 定义实体
格式: <!ENTITY 实体名称 "实体内容">
使用: &实体名称;
* 解析xml 两种方式 dom 和 sax
* jaxp解析xml dom方式
* jaxp是javase的一部分,是sun公司提供的解析器
2、jaxp使用sax方式解析xml
* sax方式解析的原理
- 采用事件驱动方式,边读边解析
* 画图分析sax方式
* 需要两部分:解析器和事件处理器
** 实现事件驱动器:继承DefaultHandler类,重写里面的方法
* 使用sax方式获取整个xml文档
使用第一个方法里面的参数 qName(开始标签名称)
使用第二个方法里面 string构造
使用第三个方法里面 qName(结束的标签名称)
* 使用sax方式获取的某个标签的文本内容
* 定义成员变量 flag = false
** 如果执行到想要获取的标签的时候,flag值ture
** 如果flag值是true时候,打印内容
* 定义一个下标
* 每次执行到结束标签时候 下标加1
3、使用dom4j解析xml(***)
* 是一个组织dom4j组织提供的,jdom的关系
* dom4j不是javase的一部分,如果想要使用,使用提供的jar包,把jar包放到项目中
* 如何把jar包加入到项目中,
- 创建文件夹,把jar包黏贴进去
- 右键点击这个jar包,build path - add to build path
- jar图标变成奶瓶的效果
4、使用dom4j查询xml里面的元素
* - element(QName qName) :获取某一个元素(第一个)
- elements(QName qName) :获取所有元素 name
- elements() :获取p1下面的所有元素
5、使用dom4j添加元素(末尾添加)
* 在第一个p1下面添加女
/*
* 1、获取dom4j的解析器
* 2、执行read方法,返回document
* 3、获取根节点
*
* 4、获取到第一个p1
* 5、在第一个p1下面添加 直接使用addElement添加sex
* 6、向sex里面添加内容 setText(“女”);
*
* 7、回写xml
//格式化操作
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(“src/person.xml”), format);
xmlWriter.write(document);
//关闭
xmlWriter.close();
6、使用dom4j在特定位置添加元素
* 在女之前添加 100
* /*
* 1、获取dom4j的解析器
* 2、执行read方法,返回document
* 3、获取根节点
*
* 4、获取到第一个p1
* 5、执行添加操作 elements():获取p1下面的所有元素
* * 得到要添加的位置
* * 创建要添加的元素
* * 在p1下面执行elements方法得到p1下面的所有元素 list
* * list里面的 add(int index, E element)
*** 创建要添加的元素 DocumentHelper类创建
* 6、回写xml
* createPrettyPrint():表示格式化的方法
createCompactFormat():表示压缩的方法
* */
7、使用dom4j修改元素
* 把女 修改男
* /*
* 1、获取dom4j的解析器
* 2、执行read方法,返回document
* 3、获取根节点
*
* 4、获取p1
* 5、获取p1下面的sex
* 6、完成修改操作 setText(“要修改的内容”)
* 7、回写xml
* */
8、使用dom4j删除元素
* 删除第一个p1下面的360310198901018910
* /*
* 1、获取dom4j的解析器
* 2、执行read方法,返回document
* 3、获取根节点
*
* 4、获取到第一个p1
* 5、获取p1下面的id
*
* 6、执行删除操作
* 获取父节点: getParent()方法获取
* 通过父节点删除 使用remove方法删除
* 7、回写xml
* */
9、使用dom4j获取属性
* 获取属性值 id=”itcast”
* /*
* 1、获取dom4j的解析器
* 2、执行read方法,返回document
* 3、获取根节点
*
* 4、获取到p1 element方法
* 5、获取p1上面的属性值 attributeValue(“属性名称”)
*
* */
10、dom4j对XPath的支持
* xpath:一种书写形式,使用xpath可以直接获取xml中某个元素
* 要想使用xpath(要想dom4j对XPath的支持),必须先要引入xpath的jar包
* 用法:
1、/AAA/DDD/BBB:按层进行获取元素
2、//BBB:表示无论有多少层,只要名称是BBB,都获取到
3、*:表示所有内容
4、/AAA/BBB[1]:表示第一个BBB
/AAA/BBB[last()]:表示最后一个BBB
5、@id: 表示属性名称是id元素
//BBB[@id] : 表示BBB元素上面有id属性的
6、 //BBB[@id='b1'] :表示BBB元素上面有id属性,并且属性值是b1
* 使用dom4j支持xpath来操作xml
- selectNodes("xpath");
- selectSingleNode("xpath");
* selectNodes("xpath");获取xml中所有name元素的内容
* /*
* 1、获取解析器
* 2、执行read方法,返回document
*
* 3、使用xpath获取name元素 返回list结合
* 4、遍历list
* 5、根据每次遍历出来的name元素,获取name的值
* */
* List<Node> list = document.selectNodes("//name");
* selectSingleNode("xpath");获取第一个p1下面的name的内容
* /*
* 1、获取解析器
* 2、执行read方法,返回document
*
* 3、使用xpath获取第一个p1下面的name元素 //p1[@id]/name
* 4、得到的name元素,获取内容
*
* */
* Node name1 = document.selectSingleNode("//p1[@id]/name");
11、xml的约束值schema
* 之前学习了dtd,为什么还要学习schema?
* dtd和schema的比较
- dtd语法