Javaweb学习笔记——(五)——————DOM&XML目录

1.表单提交方式
*使用submit提交
<form>
<input type="submit" />
</form>


*使用button提交表单
-代码
function form1(){
//获取form
var form1 = document.getElementById("form1");


form1.action = "hello.html";


form1.submit();
}
*使用超链接提交
-代码
<a href="hello.html?username123456">使用超链接提交</a>


*onclick:鼠标点击事件
onchange:改变内容(一般和select一起使用)


onfocus:得到鼠标焦点(ie5,某些版本的ie6会出现兼容性问题)
onblur:失去焦点


2.xml的简介
*eXtensible Markup Language:可扩展标记型语言
**标记型语言:html是标记型语言
也是使用标签来操作
**可扩展:
-html里面的标签是固定,每个标签都有特定的含义 <hr/>  <a></a>
-标签里面可以自己定义,可以写中文的标签<person></person> <猪></猪>


*xml用途
**html是用于显示数据,xml也可以显示数据(但不是主要功能)
**xml主要功能,为了存储数据


*xml是w3c组织发布的技术


*xml有两个版本 1.0  1.1 
-使用的都是1.0版本(1.1版本不能向下兼容)


3.xml的应用
*不同的系统之间传输数据
**聊天系统数据的传输
**画图分析工程
*用来表示生活中有关系的数据


*经常用在配置文件
*比如现在链接数据库 肯定知道数据库的用户名和密码、数据名称
*如果修改数据库的信息,不需要修改源代码,只要修改配置文件就可以


4.xml的语法
(1)xml的文档声明(*****)
*创建一个文件  后缀名为 *.html
*如果写个xml。第一步,必须要有 一个文档声明(写了文档声明之后,表示写xml文件的内容)
**文档声明:<?xml version="1.0" encoding="UTF-8"?>
**文档声明必须写在第一行第一列


*属性
-version:xml的版本1.0(使用)  1.1
-encoding:xml编码 utf-8  iso8859-1(不包含中文)
-standalone:是否需要依赖其他文件  yes/no
*注意:xml的中文乱码问题解决
**画图分析乱码问题
**保存时候的编码和设置打开时候的编码一致,不会出现乱码




(2)定义元素(标签)(*****)
(3)定义属性(*****)
(4)注释(*****)
(5)特殊字符(*****)
(6)CDATA区(了解)
(7)PI指令(了解)


5.xml的元素的定义
**标签定义


**标签有定义又开始必须要有结束:<person></person>


**标签没有内容,可以再标签内结束:<aa/>


**标签可以嵌套,但是必须合理嵌套
***合理嵌套:<aa><bb></bb></aa>
***不合理嵌套:<aa><bb></aa></bb>


**一个xml中,只能有一个根标签,其他的标签都是这个标签下面的标签


**在xml中,会把空格和换行都当成内容来解析。
下面这两段代码含义是不一样的
**<aa>123</aa>
**<aa>
123
  </aa>


**xml标签名称可以是中文


**xml中标签的名称规则
(1)xml代码区分大小写
<p></P>:这两个标签是不一样的
(2)xml的标签不能以数字和下划线开头
<aaa> <_aaa>:这丫是错误的
(3)xml的标签不能以xml、XML、Xml开头
<xmla> <Xmla> 这些都是错误的标签命名
(4)xml的表签不能包含空格和冒号
<a v> <a:c>  错误


6.xml中属性的定义
*html是标记型文档,可以有属性
*xml也是标记型文档,可以有属性


*<person id1="aa"></person>


**属性定义的要求
(1)一个标签上可以有多个属性
<person id1="a" id2="bbb"></person>
(2)属性名称不能相同
<person id1="a" id1="bbb"></person> (错误)
(3)属性名称和属性值之间使用=,属性值使用引号包起来(可以是单引号,也可以是双引号)
(4)xml属性的名称规范和元素的名称规范一致


7.xml中的注释
*写法<!--注释的内容-->
**注意的地方
***注释不能嵌套
<!--aa <!-- aa -->-->
**注释不能放到第一行,第一行第一列必须放文档声明


8.xml中的特殊字符
*如果想要在xml中现在 a<b,不能正常显示,因为把<当做标签
*如果就想要显示,需要对特殊字符进行转义
** &  &amp;
** < &lt;
** > *gt;
** " &quot;
** ' &apos;


9.CDATA区
*可以解决多个字符都需要转义的操作 if(a<b && b<c){}
*把这些内容放在CDATA区里面,不需要转义了
**写法:
<![CDATA[内容 ]]>
-代码
<![CDATA[ <b>if(a<b && b<c){}</b> ]]>
**把特殊字符当做文本内容,而不是标签


10.PI指令(处理指令)
*可以在xml中设置样式
*写法:<?xml-stylesheet type="text/css" href="one.css" ?>

*设置样式,只能对英文标签名称起作用,对于中文的标签名称不起作用的。


**xml的语法的总结
所有的XML元素都必须有关闭标签
XML标签对大小写敏感
XML必须正确的嵌套顺序
XML文档必须有根元素(只有一个)
XML的属性值必须加引号
特殊字符必须转义 --- CDATA
XML中的空格、回车换行会解析时被保留


11.xml的约束
*为什么需要约束?
**比如现在定义一个person的xml文件,只想要这个文件里面保存人的信息,比如name,age等,但是如果在xml文件中写了一个标签<猫>,发现可以正常显示,因为符合语法规范,但是猫肯定不是人的信息,xml的标签是自定义的,需要有技术来规定xml中只能出现的元素,这个时候需要约束


*xml的约束的技术:dtd约束 和schema约束(理解)


12.dta的快速入门
*创建一个文件 后缀名为 .dtd


步骤:
(1)看xml中有多少个元素,有几个元素,在dtd文件中写几个<!ELEMENT>
(2)判断元素是简单元素还是复杂元素
-复杂元素:有子元素的元素
<!ELEMENT 元素名称 (子元素)>
-简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
(3)需要在xml文件中引入dtd文件
<! DOCTYPE 根元素名称 SYSTEM "dtd文件的路径">


**打开xml文件使用浏览器打开的,浏览器只负责校验语法,而不负责校验约束

**如果想要校验xml的约束,需要使用工具(myeclipse校验工具)


**打开myeclipse开发工具
***创建一个项目day05
***在day05的src目录下面创建一个xml文件和一个dtd文件
***在xml中引入dtd文件之后,比如只能出现name,age,多写了一个a,会提示出错


13.dtd的三种引入方式
(1)引入外部的dtd文件
<!DOCTYPE person SYSTEM "1.dtd">


(2)使用内部的dtd文件
<!DOCTYPE person[
<!ELEMENT person (name,age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
]>
(3)使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
-后面学到框架 Struts2 使用配置文件 使用外部的dtd文件
-<!DOCTYPE Struts PUBLIC "....." "......">


14.使用dtd定义元素
*语法:<!ELEMENT 元素名 约束>


*简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
***(#PCDATA):约束name是字符串类型
***EMPTY:元素为空
- <sex></sex>
***ANY:任意
*复杂元素
<!ELEMENT person (name,age,sex,school)>
-子元素只能出现一次
*<!ELEMENT 元素名称 (子元素)>


*表示子元素出现的次数
+;表示一次或多次出现
?:表示零次或者一次
*:表示零次或者多次


*子元素直接使用逗号进行隔开 , 
**表示元素出现的顺序
*子元素直接使用‘|’隔开
**表示元素只能出现其中的任意一个


15.使用dtd定义属性
*语法 <!ATTLIST 元素名称 
属性名称 属性类型 属性的约束>
*属性类型
-CDATA:字符串
- <!ATTLIST birthday
ID CDATA #REQUIRED
-枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
** 红绿灯效果
**(aa|bb|cc)
- <!ATTLIST age 
ID2 (AA|BB|CC) #REQUIRED
>
-ID:值只能是字母或者下划线开头
-<!AITLIST name
ID3 ID #REQUIRED
>


*属性的约束
-#REQUIRED:表示该属性必须存在


-#IMPLIED:属性可有可无


-#FIXED:表示一个固定值 #FIXED "AAA"
-属性值必是设定的这个的固定值
-<!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
-直接值
*不写属性,使用直接值
*如果写了属性,使用设置的那个值
<!ELEMENT school ANY>
<!ATTLIST school 
ID5 CDATA "WW"
>




16.实体的定义
*语法:<!ENTITY 实体名称 "实体的值">
***<!ENTITY TEST "HELOO">
***使用实体 &实体名称; 比如 &TEST;


**注意:
*定义的实体需要写在内部的dtd里面,如果写在外部的dtd里面,在某些浏览器下,内容得不到




17.xml的解析的简介(写到java代码)(****今天最重要的内容****)
*xml是一个标记型文档


*js使用dom解析标记型文档?
-根据html的层级结构,在内存中分配一个树形结构,把html的标签,属性和文本都封装成对象
-document对象、element对象、属性对象、文本对象、Node节点对象


*xml的解析方式(技术):dom和sax
**使用dom和sax来解析xml的执行过程
***dom解析和sax解析xml区别: 


***dom:根据xml的层级结构,在内存中分配一个树形结构,把xml的标签,属性和文本都封装成对象
****使用dom方式解析缺点:如果文件过大,造成内存溢出
****使用dom方式的优点:很方便实现增删改操作


***sax:采用事件驱动,边读边解析。从上到下,一行一行的解析,解析到某一个对象,把对象名称返回
****使用sax方式优点:不会造成内存溢出,实现查询
****使用sax方式缺点:不能实现增删改操作


*解析xml,首先需要解析器
**不同的公司和组织提供了针对dom和sax方式的解析器,通过api方式提供
***sun公司提供了针对dom和sax解析器 jaxp
***dom4j组织,针对dom和sax解析器 dom4j(***实际开发中***)
***jdom组织,针对dom和sax解析器 jdom


18.jaxp的api的查看
**jaxp是javase的一部分
**jaxp解析器在jdk的javax.xml.parsers包里面
**四个列:分别针对dom个sax解析使用的类
***dom:
DocumentBuilder:解析器类
-这个类是一个抽象类,不能new
此类的实例可以从 DocumentBuilderFactory.newDocumentBuilder()方法获取


-一个方法,可以解析xml parse("xml路径") 返回的是 Document 整个文档
-返回的document是一个接口,父节点是Node,如果在document里面找不到想要的方法,就到Node中去找


-在document里面的方法
getElementByTagName(String tagName)
--这个方法可以得到标签
--返回集合NodeList


createElement(String tagName)
--创建标签


createTextNode(String data)
--创建文本


appendChaild(Node newChild)
--把文本添加到标签下面


removeChild(Node oldChild)
--通过父节点删除节点


getParentNode()
--获取父节点


NodeList list
-getLength() 得到集合的长度
-item(int index) 下标取到具体的值
for(int i=0; i<list.getLength(); i++){
list.item(i)
}


getTextContent()
-得到标签里面的内容


***sax:
SAXParser:解析器类
SAXParserFactory:解析器工厂








19.使用jaxp实现查询操作
*查询xml中所有的name元素的值
步骤:
/*
* 1.创建解析器工厂
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
* 2.根据解析器工厂创建解析器
DocumentBuilder db = dbf.newDocumentBuilder();
* 3.解析xml返回document
Document document = db.parse("src/person.xml");
* 4.得到所有的name元素
NodeList list = document.getElementsByTagName("name");
* 5.返回集合,遍历集合,得到每一个name元素
-遍历 getLength() item()
  for (int i = 0; i < list.getLength(); i++) {
Node name1 = list.item(i);//得到每一个name元素
//得到name元素里面的值
String str = name1.getTextContent();
System.out.println(str);
}

*/


***查询xml中第一个name的值
*步骤
/**
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到第一个name元素
* 5.得到第一个name元素的值
NodeList.item(下标):集合下标从0开始
6.得到具体的值,使用getTextContent方法
*/


20.使用jaxp添加节点
***在第一个p1下面(末尾)添加<sex></sex>
***步骤:
/** 

* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.得到第一个name元素
* 5.创建sex标签createElement
* 6.创建文本createTextNode
* 7.把文本添加到sex下面appendChild()
* 8.把sex添加到第一个p1下面

* 9.回写xml
*/


21.使用jasp修改节点
***修改第一个p1下面的sex内容是男
**步骤
/*
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document

* 4.得到第一个sex元素 item方法

* 5.修改sex中的文本   setTextContent方法

* 6.回写xml

*/


22.使用jaxp删除节点
***删除 <sex>男</sex>
**步骤
/*
* 1.创建解析器工厂
* 2.根据解析器工厂创建解析器
* 3.解析xml返回document
* 4.获得sex的节点
* 4.得到sex的父节点p1
* 5.删除p1中的sex标签

* 6.回写xml
*/


23.使用jaxo遍历节点
**把所有的元素标签名称打印出来
/*
* 1、创建解析器工厂
* 2、根据解析器工厂创建解析器
* 3、解析xml,返回document 


* ===递归实现
* 4.得到根节点(打印node.getNodeName())
* 5.得到根节点子节点
* 6.得到根节点子节点的子节点
*/


//递归遍历的方法
private static void list1(Node node) {
//判断是元素的时候才打印
if (node.getNodeType() == node.ELEMENT_NODE) {
System.out.println(node.getNodeName());
}
NodeList list = node.getChildNodes();
//遍历list
for (int i = 0; i < list.getLength(); i++) {
//得到每一个节点
Node node1 = list.item(i);
list1(node1);
}
}



























posted @ 2018-03-29 15:29  CHANGEMAX  阅读(99)  评论(0编辑  收藏  举报