1、表单提交方式
* 1.使用submit提交
<form>
...
<input type="submit"/>
</form>
* 2.使用button提交
- 代码
<body>
<form id="form1">
<input type="text" name="uesename"/><br>
<input type="button" value="提交" onclick="form1();"/>
</form>
</body>
<script type="text/javascript">
function form1(){
var form1=document.getElementById("form1");
form1.action="hello.html";
form1.submit();
}
</script>
* 3.使用超链接提交
<a href="hello.html?username=123">使用超链接提交</a>
* 事件:
onclick:鼠标点击事件
onchange:改变内容(一般和select一起使用)
onfocus:得到焦点
onblur:失去焦点
关于xml
1、xml简介
* eXtensible Markup Language:可扩展标记型语言
** 标记型语言:html是标记型语言
- 也是使用标签来操作
** 可扩展:
- html里面的标签是固定,每个标签都有特定的含义
- 标签可以自己定义,可以写中文的标签
* xml用途
** html是用于显示数据,xml也可以显示数据(不是主要功能)
** xml主要功能,为了存储数据
* xml是w3c组织发布的技术
* xml有两个版本 1.0 1.1
- 使用的都是1.0版本
2、xml的应用
1)不同的系统之间传输数据
2)用来表示生活中有关系的数据
3)经常用在文件配置
3、xml的语法
1)xml的文档声明
* 创建一个文件 .xml
* <?xml version="1.0" encoding="gbk"?>
** 文档声明必须写在第一行第一列
* 属性
- version:xml版本
- encoding:xml编码 gbk 中文简体 utf-8 中文 iso8859-1 不包含中文
- standalone:是否需要依赖其他文件 yes/no
2)定义元素(标签)
3)定义属性
4)注释
5)特殊字符
6)CDATA区
7)PI指令
4、xml的元素(标签)定义
** 标签定义有开始必须有结束
** 标签没有内容,可以在标签内结束 <aa/>
** 标签可以嵌套
** 一个xml中,只能有一个根标签,其它标签都是这个标签下面的子标签
** 在xml中,会把空格和换行都当成内容来解析
** xml标签可以是中文
** xml标签的命名规则
1.xml代码区分大小写
2.xml标签不能以数字和下划线开头
3.xml标签不能以xml、XML、Xml等开头
5、xml的属性
* html是标记型文档,可以有属性
* xml也是标记型文档,也可以有属性
*属性定义的要求
1)一个标签上可以有多个属性
2)属性名称不能相同
3)属性名称和属性值之间用 = ,属性值用单引号或者双引号
4)xml属性的名称规范与元素的名称规范一致
6、xml中的注释
*
* 注释不能嵌套
7、xml中的特殊字符
* 如果想要在xml中显示 a< b,就要用到转义
< <
> >
8、CDATA区(了解)
* 可以解决多个字符都需要转义的操作
if( a < b && b < c && d > f ){}
* 把这些内容放到CDATA区里面,就不需要转义了
* 写法:
<![CDATA[ 内容 ]]>
比如:
<![CDATA[ <b> if( a < b && b < c && d > f ){} </b>]]>
* 把特殊字符当做文本内容,而不是标签
9、PI指令(处理指令)(了解)
* 可以在xml中设置样式
* 写法
<?xml-stylesheet type="text/css" href="css文件的路径"?>0:04
* 设置样式,只能对英文标签名称起作用,对于中文的标签名称不起作用的
xml的约束
10、xml的约束
1)dtd
* 创建一个文件 后缀名为 .dtd
* 步骤:
1.看xml中有多少个元素,就在dtd文件中写几个<!ELEMENT>
2.判断元素是简单元素还是复杂元素
- 复杂元素:有子元素的元素
<!ELEMENT 元素名称(子元素1,子元素2..)>
- 简单元素:没有子元素
<!ELEMENT 元素名称 (#PCDATA)>
3.需要在xml文件中引入dtd文件
<!DOCTYPE 根元素名称 SYSTEM "DTD的路径">
** 打开xml文件使用浏览器打开,浏览器只负责校验xml的语法,不负责校验约束
** 如果校验xml的约束,要用MYECLIPSE
* dtd文件的引入方式(3种)
1)引入外部的dtd文件
<!DOCTYPE 根元素名称 SYSTEM "DTD的路径">
2)使用内部的dtd文件
<!DOCTYPE 根元素名称 [
<!ELEMENT 复杂元素名称 (子元素1,子元素2...)>
<!ELEMENT 简单元素名称 (#PCDATA)>
<!ELEMENT 简单元素名称 (#PCDATA)>
<!ELEMENT 简单元素名称 (#PCDATA)>
......
]>
3)使用外部的dtd文件(网络上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名称" "DTD文档的URL">
* dtd定义元素
* 语法:<!ELEMENT 元素名 约束>
* 简单元素:没有子元素的元素
<!ELEMENT name (#PCDATA)>
- (#PCDATA) 约束name是字符串的类型
- EMPTY 约束元素为空,没有内容
- ANY 任意类型
* 复杂元素
<!ELEMENT 元素名 (子元素列表)>
表示子元素出现的次数:
- + 表示一次或多次
- ? 表示零次或一次
- * 表示零次或多次
* 子元素直接用逗号隔开,表示元素出现的顺序
* 子元素直接用 | 隔开,表示只能出现其中的任意一个
* 使用dtd定义属性
** 语法:
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
** 属性类型
- CDATA 字符串
<!ATTLIST birthday
ID1 CDATA #REQUIRED
>
- 枚举:表示只能在一定的范围内出现值,但是只能每次出现其中的一个
** 红绿灯效果
** (a|b|c)
<!ATTLIST age
ID2 (a|b|c) #REQUIRED
>
- ID:值只能是字母或者下划线开头
<!ATTLIST name
ID3 ID #REQUIRED
>
** 属性的约束
- #REQUIRED:属性必须存在
- #IMPLIED:属性可有可无
- #FIXED:表示一个固定值 #FIXED "AAA"
*** 属性的值必须是设置的这个固定值
*** <!ATTLIST sex
ID4 CDATA #FIXED "ABC"
>
- 直接值
* 不写属性,使用直接值
* 写了属性,使用设置的值
<!ATTLIST school
ID5 CDATA "www"
>
11、实体的定义
* 语法 <!ENTITY 实体名称 实体内容>
<!ENTITY TEST "AAAA">
使用实体 &实体名称; 比如 &TEST;
xml的解析
12、xml的解析的简介
* xml是标记型语言
* js使用dom解析标记性文档?
- 根据html的层级结构,在内存中分配一个树形结构,把html的标签、属性和文本都封装成对象
- document对象、element对象、属性对象、文本对象、Node节点对象
* xml的解析方式(技术):dom 和 sax
- dom:根据xml的层级结构在内存中分配一个树形结构
缺点:如果文件过大,容易造成内存溢出
优点:很方便的实现增删改操作
- sax:采用事件驱动,边读边解析
从上到下,一行一行解析,解析到某一对象,返回对象名称
缺点:不能实现增删改
优点:如果文件过大,不会造成内存溢出
* 想要解析xml,首先需要解析器
** 不同公司和组织提供了针对dom和sax的解析器,通过api方式提供
** sun公司提供的针对dom和sax的解析器..jsxp
dom4j组织.........................dom4j(开发中用这个)
jdom..............................jdom
13、jaxp的api的查看
** jaxp是javase的一部分
** jaxp解析器在jdk的javax.xml.parser包里面
*** 四个类
dom:
DocumentBuilder:解析器类
- 这个类是抽象类,不能new
此类的实例用DocumentBuilderFactory.newDocumenttBuilder();方法获取
- 一个方法,可以解析xml parse("xml路径") 返回是Document 整个文档
- 返回的document是个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面去找
- 在document里的方法
* getElementsByTagName(String tagname)
-- 这个方法可以得到标签,返回集合 NodeList
* createElement(String tagName)
-- 创建标签
* createTextNode(String data)
-- 创建文本
* appendChild(Node newChild)
-- 把文本添加到标签下面
* removeChild(Node oldchild)
-- 删除节点
* getParentNode()
-- 获取父节点
* getTextContent()
-- 得到具体值
NodeList
- getLength() 得到集合的长度
- item(int index) 下标取到具体的值
NodeList list
for(int i=0;i< list.getLength();i++){
list.item(i);
}
DocumentBuilderFactory:解析器工厂
- 这个类是抽象类,不能new
newInstance()获取DocumentBuilderFactory的实例
sax:
SAXParser:解析器类
SAXParserFactory:解析器工厂
dom的解析过程
sax的解析过程
schema以及sax的解析
1、schema约束
** 符合xml的语法,xml语句
** 一个xml中可以有多个schema,多个schema使用名称空间区分(类似于java包名)
** dtd里面有PCDATA类型,但是在schema里面可以支持更多的数据类型
*** 比如 年龄只能是证书,在schema可以直接定义一个整数类型
** schema语法更加复杂,schema目前不能代替dtd
2、schema的快速入门
* 创建schema文件 后缀 .xsd
** 根节点 <schema>
* 在schema文件里面
属性 <scheam xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.baidu.com/2018"
elementFormDefault="qualified"
>
** xmlns="http://www.w3.org/2001/XMLSchema"
- 表示当前xml文件是一个约束文件
** targetNamespace="http://www.baidu.com/2018"
- 使用schema约束条件,直接通过这个地址引入约束条件
** elementFormDefault="qualified"
步骤:
1)看xml中有多少个元素
<element>
2)复杂元素和简单元素
<element name="person">
<complexType>
<sequence>
<element name="name" type="string"></element>
<element name="age" type="integer"></element>
</sequence>
</complexType>
</element>
3)在被约束文件xml引入约束文件xsd
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.baidu.com/2018"
xsi:schemaLocation="http://www.baidu.com/2018 1.xsd"
>
** xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 表示xml是一个被约束的文件
** xmlns="http://www.baidu.com/2018"
- 是约束文档里面 targetNamespace
** xsi:schemaLocation="http://www.baidu.com/2018 1.xsd"
- targetNamespace + 空格 + 约束文档的地址路径
* sequence 约束子元素是按顺序的
* all 元素只能出现一次
* choice 元素只能出现其中的一个
* any 表示任意元素
* maxOccurs 放在element标签中,限制element出现的次数
- unbounded:无限制的出现
maxOccurs="unbounded"
* 可以约束属性
在.xsd文件中
<attribute name="id1" type="int" use="required"></attribute>
</complexType>
name:属性名称
type:属性类型 int String
use:属性是否必须出现 required
* 复杂的约束
3、sax的解析过程
* sax方式:事件驱动、边读边解析
* 在java.xml.parsers包里面
** SAXParser
此类的实例可以从 SAXParserFactory.newSAXParser() 方法获得
- parser(File f,DefaultHandler dh)
* 参数1:xml的路径
参数2:事件处理器
** SAXParserFactory
实例 newInstance() 方法得到
* 画图分析sax的执行过程
* 当解析到开始标签时,自动执行startElement方法
* 当解析到文本时,自动执行characters方法
* 当解析到结束标签时,自动执行endElement方法
4、使用jaxp的sax方式解析xml
-------------------
* sax方式不能实现增删改操作,只能做查询操作
** 打印出整个文档
*** 执行parse方法,第一个参数xml路径,第二个参数是事件处理器
** 创建一个类,集成事件处理器的类
** 重写里面的三个方法
* 获取到所有的name元素的值
** 定义一个成员变量 flag=false
** 判断开始方法是否是name元素,如果是name元素,把flag值设置成true
** 如果flag值是true,在characters()方法里打印内容
** 当执行到结束方法的时候,把flag值设置成false
* 获取第一个name元素的值
** 定义一个成员变量 idx=1
** 在结束方法时候,idx+1 idx++
** 想要打印出第一个name元素的值
- 在characters()方法里面判断
- 判断flag=true && idx=1 ,再打印内容
使用dom4j解析xml的讲解
5、使用dom4j解析xml
* dom4j,是一个组织没针对xml解析,提供解析器 dom4j
* dom4j不是javase的一部分,所以使用时需要:
** 导入dom4j提供jar包
- 创建一个文件夹 lib
- 复制jar包到lib下
- 右键点击jar包 ,build path ->add to buildpath
* 得到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
* 查询所有name元素里面的值
步骤: 1、创建解析器
2、得到document
3、得到根节点
4、得到所有的p1标签
5、得到name
6、得到name里面的值
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Element root=document.getRootElement();
List<Element> list=root.elements("p1");
for(Element element:list){
Element name1=list.element("name");
String s=name1.getText();
system.out.println(s);
}
* 查询第一个name元素里面的值
步骤: 1、创建解析器
2、得到document
3、得到根节点
4、得到第一个p1元素
5、得到p1下面的name元素
6、得到name元素里面的值
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Element root=document.getRootElement();
Element p1=root.element("p1");
Element name1=p1.element("name");
String s=name1.getText();
system.out.println(s);
7、使用dom4j实现添加操作
*在第一个p1标签末尾添加一个元素<sex>nv</sex>
4、获取到第一个p1
5、在p1下边添加元素
6、在添加完成之后的元素下面添加文本
7、回写xml
8、关流
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Element root=document.getRootElement();
Element p1=root.element("p1");
//在p1下边直接添加元素
Element sex1=p1.addElement("sex");
//直接添加文本内容
sex1.setText("nv");
//回写xml
OutputFormat format=OutputFormat.createPrettyPrint(); //这个方法xml会有缩进的效果
//OutputFormat format=OutputFormat.createCompactFormat(); 这个方法xml一行输出
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
xmlWriter.write(document);
xmlWriter.close();
8、在特定位置添加元素
* 在第一个p1下面的age标签之前添加school标签
4、获取到第一个p1
5、获取到p1下面的所有元素
** elements() 返回list集合
** 使用list里面的方法,在特定位置添加元素
** 创建新的元素标签并写内容
- 创建新标签用DocumentHelper类
**add(int index,E element)
- 第一个参数是 位置下标,从0开始
- 第二个参数是 要添加的元素
6、回写xml
7、关流
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Element root=document.getRootElement();
Element p1=root.element("p1");
List<Element> list=p1.elements();
Element school=DocumentHelper.createElement("school");
school.setText("high");
list.add(1,school);
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
xmlWriter.writer(document);
xmlWriter.close();
9、使用dom4j实现修改节点的操作
* 修改第一个p1下面的age元素的值<age>30</age>
1、得到document和根节点root
2、得到第一个p1元素
3、得到第一个p1下面的age
4、修改值是30
5、回写xml
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Element root=document.getRootElement();
Element p1=root.element("p1");
Element age=p1.element("age");
//修改操作
age.setText("30");
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
xmlWriter.writer(document);
xmlWriter.close();
10、使用dom4j实现删除操作
* 删除第一个p1下面的school元素
1、得到document和根节点root
2、得到第一个p1元素
3、得到第一个p1下面的school
4、删除(使用父节点p1来删除)
5、回写xml
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Element root=document.getRootElement();
Element p1=root.element("p1");
Element school=p1.element("school");
//删除操作
//获取父节点:school.getParent();返回的是element
p1.remove(school);
OutputFormat format=OutputFormat.createPrettyPrint();
XMLWriter xmlWriter=new XMLWriter(new FileOutputStream("src/p1.xml"),format);
xmlWriter.writer(document);
xmlWriter.close();
11、使用dom4j获得属性值的操作
* 获取第一个p1里面的属性id1的属性值
1、得到document和根节点root
2、得到第一个p1元素
3、得到第一个p1里面的属性值
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Element root=document.getRootElement();
Element p1=root.element("p1");
//得到p1里面的属性值
String value=p1.attributeValue("id1");
System.out.println(value);
12、使用dom4j支持xpath的操作
* 可以直接获取到某个元素
* 第一种形式:/AAA/DDD/BBB:表示一层一层的,AAA下面的DDD下面的BBB
* 第二种形式://BBB:表示和这个名称相同,表示只要名称是BBB,都得到
* 第三种形式:/* : 表示所有元素
* 第四种形式:BBB[1]:表示第一个BBB元素
BBB[last()] : 表示最后一个BBB元素
* 第五种形式://BBB[@id]:表示只要BBB元素上面有id属性,都得到
* 第六种形式://BBB[@id='1']:表示只要BBB元素上面有id属性,并且属性值=1
13、使用dom4j支持xpath具体操作
** 默认情况下,dom4j里面是有xpath
** 如果想要在dom4j里面是有xpath
* 第一步需要,引入支持xpath的jar包,使用 jaxen-1.1-bate-6.jar
* 需要把jar包导入到项目中
** 在dom4j里面提供了两个方法,用来支持xpath
*** selectNodes("xpath表达式")
获取多个节点
*** selectSingleNode("xpath表达式")
获取一个节点
** 使用xpath实现:查询xml中所有name元素的值
** 所有name元素的xpath表示://name
** 使用selectNodes("//name")
步骤: 1、得到document
2、直接用selectNodes("//name")得到所有name元素
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
List<Node> list=document.selectNodes("//name");
for(Node node:list){
//node是每一个name元素
String s=node.getText();
system.out.println(s);
}
** 使用xpath实现:获取第一个p1下面name的值
** 使用selectSingleNode("//p1[@id='1']/name")
代码:
SAXReader saxreader=new SAXReader();
Document document=saxreader.read("src/p1.xml");
Node name1=document.selectSingleNode("//p1[@id='1']/name");
String s=name1.getText();
system.out.println(s);
14、实现简单的学生管理系统
** 使用xml当做数据,存储学生信息
** 创建一个xml文件,写一些学生信息
** 增加操作: 1、创建解析器
2、得到document
3、获取根节点
4、在根节点上面创建stu标签
5、在stu标签上面依次添加id、name、age
- addElement()方法添加
6、在id name age 上面依次添加值
- setText()方法
7、回写xml
** 删除操作(根据id删除):
3、获取所有的id
- 使用xpath //id 返回list集合
4、遍历集合
5、判断集合里面的id和传递的id是否相同
6、如果相同,把id所在的stu删除
** 查询操作(根据id查询):
3、获取所有的id
4、返回的是list集合,遍历list集合
5、得到每一个id的节点
6、id节点的值
7、判断id的值和传递的id值是否相同
8、如果相同,先获取到id的父节点stu
9、通过stu获取到name age值