day05
1、上节内容回顾
2、表单提交方式
* 使用type="submit"
- <input type="submit" value="提交"/>
* 使用type="button"
- //获取到form
var form1 = document.getElementById("form1");
//设置action
form1.action = "1.html";
//实现提交 submit();
form1.submit();
* 事件
- onclick:鼠标点击事件
- onchange:改变事件(经常和下拉框一起使用)
- onfocus: 获取焦点事件,在一些浏览器版本低 ie6
- onblur:失去焦点
3、xml简介和应用
* 是什么?做什么?怎么做?
* eXtensible Markup Language:可扩展标记型语言
** 标记型语言:使用标签进行操作 html、xml
** 可扩展:html里面的标签是固定 <font> <br/> ; xml中标签是自定义 (可以包含中文标签名)<perosns> <猫> <狗>
** xml是为了传输数据
* 应用:
1、用于系统间数据的传输
* 画图分析qq直接数据的传输
2、用于表示生活中有关系的数据
3、用在配置文件中
4、xml的语法-文档声明
* 如果要创建一个xml文档,必须要有一个文档声明
* 格式: <?xml version="1.0" encoding="utf-8"?>
** version(必须要有): 表示xml的版本 1.0 1.1(要是有1.0 ,因为1.1版本不会向下兼容)
** encoding(可选): xml文档的编码方式 utf-8 gbk (gb2312 gb2310) iso8859-1
** standalone(可选):表示文档是否是独立的文档
* 注意的问题:
1、文档声明必须要放在第一行第一列
2、xml文档的编码方式要和浏览器默认的编码方式一致
5、xml的元素(标签)定义
* 自定义的标签 <person></person> <猫></猫>
* 标签定义有开始必须要有结束 <person> aaa </person> <p1/>
* 标签必须是合理嵌套
<p1><p2></p1></p2> :这种方式是不正确的
<p1> <p2></p2></p1>
* xml文档只能有一个根标签
** 标签的命名规范
1、区分大小写 <person ><PERSON> 这两个标签是不一样的
2、标签不能以数字或者下划线开头 <1a> <_aa> 这两种是不正确的
3、不能以xml(或XML、或Xml 等)开头。
4、 不能包含空格。 <a b> 不正确的
5、名称中间不能包含冒号(:)。 <aa:bb> 不正确的
** xml解析的时候会把空格和换行都当成内容来处理
6、xml的属性定义
* 每个标签可以有多个属性,但是属性不能相同
* 属性和属性值之间使用引号(单引号和双引号)
* 属性名称的命名规范和元素名称的命名规范相同
7、xml的注释
*格式: <!-- xml注释 -->
* 注释不能嵌套
** <!-- <!-- xml注释 --> --> 不正确的
8、转义字符
< : <
> : >
& : &
" : "
' : '
9、CDATA区
* character data
* 把CDATA区里面的内容直接作为字符串来显示出来,而不是作为标签来操作
* 语法:<![CDATA[内容]]>
<![CDATA[ 内容 ]]>
10、处理指令(鸡肋)
* xml设置样式
** <?xml-stylesheet type="text/css" href="some.css"?>
* 对中文命名的标签元素不起作用
* 处理指令不能放在第一行,第一行必须要放文档声明
11、xml的约束
常用的有两种约束技术: dtd 和 schema
* 什么是约束?为什么xml需要约束?
* 比如定义xml文档,定义person,想让里面只能出现人的一些信息,name、age,只能出现人的信息
但是xml定义的标签自定义,a、b、面积,这些内容肯定不是人的信息,所以这个时候需要对xml文档进行约束,
约束xml里面只能出现人的属性。
* dtd快速入门
1、创建xml文档
2、创建一个约束文件 后缀名 .dtd
** 语法 <!ELEMENT 元素名称 元素类型>
dtd步骤:
1、保存dtd文件
2、看xml中有多少个元素
<!ELEMENT 元素名称 元素类型>
3、看这个元素是简单元素还是复杂元素
* 有子元素的元素是复杂元素
<!ELEMENT 元素名称 (子元素)>
* 没有子元素的元素是简单元素
<!ELEMENT 元素名称 (#PCDATA)>
** <!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
* 浏览器可以直接解析xml,但是浏览器并不负责校验xml
* 如果想要校验xml使用校验工具 myeclipse校验
* <!ELEMENT person (name,age)> //person复杂元素 (name,age):是person下面的子元素
<!ELEMENT name (#PCDATA)> //name是简单元素 (#PCDATA):类型
<!ELEMENT age (#PCDATA)>
* 在xml中引入dtd
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
12、dtd的引入方式
* 使用引入外部dtd
<!DOCTYPE 根元素名称 SYSTEM "dtd路径">
* 使用内部的dtd
* 把dtd代码写在xml中
* <!DOCTYPE person [
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
* <!DOCTYPE 根元素名称 [
dtd代码
]>
* 使用公共的dtd约束
* <!DOCTYPE 根元素名称 PUBLIC “DTD名称” “DTD文档的URL”>
13、dtd定义元素(约束元素)
* dtd语法 <!ELEMNT 元素名称 使用规则>
** 使用规则
* 如果元素是简单元素时候 :
** (#PCDATA): 字符串
** EMPTY: 空
** ANY:任何类型
- <!ELEMENT age (#PCDATA)>
<!ELEMENT sex EMPTY>
<!ELEMENT love ANY>
* 如果是复杂元素时候 (子元素名称)
** (name,age,sex): 表示元素要按照设置的顺序出现
** (name|age|sex): 只能出现其中的一个
** 设置元素出现的次数
- 使用+ : 出现一次或者多次
- 使用* :出现零次或者多次
- 使用? :出现零次或者一次
- <!ELEMENT person (name+,age*,sex,love?)>
14、dtd定义属性
* 格式:
<!ATTLIST 元素名称
属性名称1 属性类型 属性约束
属性名称2 属性类型 属性约束
....
>
* 属性类型
** CDATA: 字符串
** 枚举:表示只能在一定范围内出现其中的一个内容
- 没有特定的关键字
- (name|age|sex)
** ID类型 :只能使用字母和下划线开头 ,用于区分元素
* 属性约束
* #REQUIRED: 表示属性必须要出现
* #IMPLIED:表示属性可有可无的
* 固定值 #FIXED "ABC": 表示属性的值必须是设置的这个值
* 直接值:如果没有设置这个属性的值,使用直接值;如果设置了属性的值,使用设置的值
15、dtd定义实体
* 定义实体要使用内部dtd
* 每个页面都需要 copyright “传智播客版权所有”,
* 通过定义实体来定义这个内容,在每个xml中直接调用这个定义的实体,不需要每个xml中都写一遍
* 格式: <!ENTITY 实体名称 "实体内容">
* 在xml中如何使用 &实体名称;
* 注意的问题:在一些版本的浏览器下,定义实体必须要使用内部dtd,如果使用外部的dtd不好使
16、xml解析简介(******今天最重要的内容 java代码)
* 解析xml分为两种方式:dom和sax
** dom:document object model:文档对象模型
* 根据xml的层级结构在内存中分配一个树形结构
** 优点:方便实现增删改操作
** 缺点:如果文档过大,会造成内存溢出
** sax:
* 采用事件驱动,边读边解析
** 优点:查询方便,不会出现内存溢出
** 缺点:无法实现增删改操作
*** 画图分析一下dom和sax
* 如果要对xml进行解析,首先必须要有一个解析器
** 不同的公司和组织,针对这两种方式 dom和sax,提供了解析器,通过api形式来提供
1、sun公司提供针对这两种方式的api,JAXP 解析dom和sax
2(****)、dom4j组织,针对这两种提供了api,dom4j
3、jdom组织,针对这两种方式提供api,jdom
17、使用JAXP解析xml简介
* jaxp是sun公司提供的技术,jaxp是javase的一部分 ,jdk文档
** 找到 javax.xml.parsers包
***使用dom解析 DocumentBuilderFactory和DocumentBuilder
- DocumentBuilder:表示解析器,但是这个类是抽象类,
此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder() 方法获取
- DocumentBuilderFactory:表示解析器工厂,也是一个抽象类
** newInstance() 获取 DocumentBuilderFactory 的新实例
** 如何获取到jaxp 解析器 DocumentBuilder
1、获取DocumentBuilderFactory解析器工厂 newInstance()
2、获取DocumentBuilder解析器,通过 DocumentBuilderFactory.newDocumentBuilder()
3、使用 DocumentBuilder类里面的parse(String uri) 进行解析
4、执行完成parse方法之后返回Document(代表整个文档)
** 常用方法:
- getElementsByTagName(String tagname) :根据标签名称得到标签,返回NodeList
- createElement(String tagName) :创建标签
- createTextNode(String data) :创建文本
- appendChild(Node newChild) : 把文本添加到标签下面
** Document是一个接口,父接口是Node
18、使用jaxp实现xml的查询操作
* 查询name标签里面的内容
* 1、获取DocumentBuilderFactory解析器工厂 newInstance()
2、获取DocumentBuilder解析器,通过 DocumentBuilderFactory.newDocumentBuilder()
3、使用 DocumentBuilder类里面的parse(String uri) 进行解析
4、执行完成parse方法之后返回Document(代表整个文档)
5、获取name标签 使用 getElementsByTagName()
6、返回是NodeList,遍历集合
** 获取NodeList长度 getLength()
** 获取遍历之后具体值 item()
7、获取元素里面具体内容
* getTextContent()方法获取
* 查询第一个name元素里面的内容
1、获取DocumentBuilderFactory解析器工厂 newInstance()
2、获取DocumentBuilder解析器,通过 DocumentBuilderFactory.newDocumentBuilder()
3、使用 DocumentBuilder类里面的parse(String uri) 进行解析
4、执行完成parse方法之后返回Document(代表整个文档)
5、获取所有的name元素
6、直接使用item()方法获取到某个位置的元素
- document.getElementsByTagName("name").item(1);
- 开始位置是 0
19、使用jaxp实现xml中添加元素
* 在第一个p1元素下面添加 <sex>nv</sex>
* /*
* 1、创建解析器工厂
* 2、根据解析器工厂,创建解析器
* 3、使用parse方法解析xml
*
* 4、获取到第一个p1元素 ,获取到所有p1,使用item方法获取第一个p1
* 5、创建sex元素 使用createElement方法创建元素
* 6、创建文本 nv 使用createTextNode方法创建文本
* 7、把文本添加到sex元素下面 使用appendChild添加
*
* 8、把sex元素添加到第一个p1下面 使用appendChild添加
*
* 9、回写xml 使用TransFormer
* */
20、使用jaxp实现xml元素内容修改
* 把<sex>nv</sex>修改为 <sex>nan</sex>
* /*
* 1、创建解析器工厂
* 2、根据解析器工厂,创建解析器
* 3、使用parse方法解析xml
*
* 4、获取到sex元素
* 5、实现修改 setTextContent方法
* 6、回写xml
* */
21、使用jaxp实现xml删除元素
* 删除第二个p1元素里面age元素
* /*
* 1、创建解析器工厂
* 2、根据解析器工厂,创建解析器
* 3、使用parse方法解析xml
*
* 4、获取到第二个p1元素下面的age item(1)
* 5、获取p1元素 父元素 getParent方法
* 6、执行删除操作 使用 removeChild方法
- 通过父节点删除(父元素进行删除)
* 7、回写xml
*
* */
22、使用jaxp实现xml的遍历操作
* 把xml中所有的标签名称显示出来
* /*
* 1、创建解析器工厂
* 2、根据解析器工厂,创建解析器
* 3、使用parse方法解析xml
*
* 4、使用getChildNodes()获取元素下面的子元素
* 5、使用递归操作
*
* */