Java进阶学习第五天——XML入门
来源:互联网 发布:农业银行app网络异常 编辑:程序博客网 时间:2024/05/29 13:20
onsubmit事件
- 控制表单提交
- 需要把onsubmit作用在表单上
<form onsubmit="">
- 值的写法:
onsubmit="return run()"
- run()必须要有返回值,必须返回true或者false。
- 如果返回是true,表单可以提交,如果返回false,表单不能提交。如果没有返回值,默认是表单提交。
- run()的逻辑写什么?
- 表单的校验。
- 需要把onsubmit作用在表单上
<script type="text/javascript"> // 给姓名提示 function run1(){ var uspan = document.getElementById("uspan"); uspan.innerHTML = "不能输入特殊字符"; } // 表单校验,必须有返回值 function run(){ // 校验姓名 var name = document.getElementById("nameId").value; if(name == "" || name.length == 0){ var uspan = document.getElementById("uspan"); uspan.innerHTML = "用户名不能为空"; return false; } // 校验密码 var pwd = document.getElementById("pwdId").value; if(pwd == "" || pwd.length < 6){ var pspan = document.getElementById("pspan"); pspan.innerHTML = "密码至少6位"; return false; } // 确认密码 var repwd = document.getElementById("repwdId").value; if(pwd != repwd){ var rpspan = document.getElementById("rpspan"); rpspan.innerHTML = "两次密码不一致"; return false; } // 确认密码 // /^表达式$/.test(string) 返回true获取false var email = document.getElementById("emailId").value; if(!/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(email)){ var espan = document.getElementById("espan"); espan.innerHTML = "邮箱格式不正确"; return false; } } // 使用js提交表单 function run2(){ // 通过id获取form // var form = document.getElementById("formId"); // 通过form的name的属性获取表单 var form = document.form1; //var name = document.form1.username.value; //alert(name); // 设置提交的路径 form.action = "success.html"; form.method = "get"; // 提交表单 form.submit(); }</script></head><body> <form id="formId" name="form1" onsubmit="return run()"> <table border="1" width="60%"> <tr> <td>输入姓名</td> <td> <input type="text" name="username" id="nameId" onfocus="run1()"/><span id="uspan"></span> </td> </tr> <tr> <td>输入密码</td> <td> <input type="password" name="password" id="pwdId" /><span id="pspan"></span> </td> </tr> <tr> <td>确认密码</td> <td> <input type="password" name="repassword" id="repwdId" /><span id="rpspan"></span> </td> </tr> <tr> <td> 输入邮箱 </td> <td> <input type="text" name="email" id="emailId" /><span id="espan"></span> </td> </tr> <tr> <td colspan="2"> <!-- <input type="submit" value="注册"> --> <input type="button" value="注册" onclick="run2()"> </td> </tr> </table> </form></body>
通过js提交表单
// 通过id获取form // var form = document.getElementById("formId"); // 通过form的name的属性获取表单 var form = document.form1; //var name = document.form1.username.value; //alert(name); // 设置提交的路径 form.action = "success.html"; form.method = "get"; // 提交表单 form.submit();
XML语言
XML的简介
XML
是指可扩展标记语言(eXtensible Markup Language),它是一种标记语言,很类似HTML。它被设计的宗旨是传输数据,而非显示数据。- XML标签没有被预定义,需要用户自行定义标签。
- XML技术是
W3C组织
(World Wide Web Consortium万维网联盟)发布的,目前遵循的是W3C组织于2000年发布的XML1.0
规范。 XML被广泛认为是继Java之后在Internet上最激动人心的新技术。
XML传输数据,HTML是显示数据。
- XML的版本:
- XML1.0(使用该版本)
- XML1.1(不向下兼容)
XML技术用于解决什么问题
- XML语言出现的根本目的在于描述有关系的数据。
- XML是一种通用的数据交换格式。
- 在XML语言中,它允许用户自定义标签。一个标签用于描述一段数据;一个标签可分为开始标签和结束标签,在起始标签之间,又可以使用其它标签描述其它数据,以此来实现数据关系的描述。
- XML中的数据必须通过软件程序来解析执行或显示;这样的解析程序称之为
Parser(解析器)
。
<?xml version="1.0" encoding="UTF-8"?><中国> <北京> <海淀></海淀> <丰台></丰台> </北京> <山东> <济南></济南> <青岛></青岛> </山东> <湖北> <武汉></武汉> <荆州></荆州> </湖北></中国>
XML常见应用
- XML技术除用于保存有关系的数据之外,它还经常用作软件配置文件,以描述程序模块之间的关系。(如后面将要学习到的Struts、Spring和Hibernate都是基于XML作为配置文件的)
在一个软件系统中,通过XML配置文件可以提高系统的灵活性。即程序的行为是通过XML文件来配置的,而不是硬编码。
数据交换:不同语言之间用来交换数据
应用
- 作为配置文件。
- 可以在系统与系统之间进行数据的传输。
XML的语法
- 一个XML文件分为如下几部分内容:
- 文档声明
- 元素
- 属性
- 注释
- CDATA区 、特殊字符
- 处理指令(PI:Processing Instruction)
文档声明(重点)
- 最简单的语法:
<?xml version="1.0" ?>
- 文档声明必须出现在xml文件的第一行和第一列的位置。
属性:
- version=”1.0” XML的版本 (必须写)
- encoding=”UTF-8” 编码集 (可选的)
- standalone=”yes或者no” 代表xml的文件是否是独立的。(如果是no,不独立,可以引入外部的文件)(可选的)
- 不写该属性,可以引入外部的文件。
乱码问题
- 产生的原因:保存文件时和打开文件时采用的编码不一致。
- 解决办法:保存文件可打开文件采用的编码一致就ok。(MyEclipse不会产生乱码问题)
元素
XML元素
指XML文件中出现的标签。一个标签分为起始
和结束标签
(不能省略)。一个标签有如下几种书写形式:- 包含标签主体:
<mytag>some content</mytag>
- 不含标签主体:
- 一个标签中可以嵌套若干子标签,但所有标签必须合理的嵌套,不允许有交叉嵌套。
<mytag1><mytag2></mytag1></mytag2>
:错误
- 包含标签主体:
一个XML文档必须有且仅有一个根标签,其他标签都是这个根标签的子标签或孙标签。
命名规范:
- 区分大小写 错误的:
<a> </A>
代表两个标签 - 不能以
数字
和-
开头 错误的:<1a> <-a>
- 不能以
XML
(Xml XML xml)开头 错误的:<xmlaa>
- 不能包含
空格
和冒号
。
- 区分大小写 错误的:
由于在XML中,空格和换行都作为原始内容被处理,所以,在编写XML文件时,使用换行和缩进等方式来让原文件中的内容清晰可读的“良好”书写习惯可能要被迫改变。例如:下面两段内容的意义是不一样的。
属性
- 在同一个元素上,不能有相同的属性。(重点)
可以使用双引号或者单引号。
一个元素可以有多个属性,每个属性都有它自己的名称和取值,例如:
<mytag name=“value” …/>
- 属性值一定要用引号(单引号或双引号)引起来。
- 属性名称的命名规范与元素的命名规范相同
- 元素中的属性是不允许重复的
- 在XML技术中,标签属性所代表的信息也可以被改成用子元素的形式来描述,例如:
<mytag> <name> <firstName/> <lastName/> </name></mytag>
注释
- 和HTML的注释相同,注释不能有嵌套。
<!-- XML的注释 -->
特殊字符
<
:<
;>
:>
;&
:&
;"
:"
;'
:&apos
;<
和&
的符号要用转义字符>
“
‘
可以不使用转义字符
CDATA区
CDATA
是Character Data的缩写- 作用:把标签当做普通文本内容;
语法:
<![CDATA[内容]]>
把标签中的内容作为字符串。
- 语法:
<![CDATA[ <itcast>www.itcast.cn</itcast>]]>
PI(处理指令)
- 为了替换替换HTML
XML的约束
为什么需要约束
- XML都是用户自定义的标签,若出现小小的错误,软件程序将不能正确地获取文件中的内容而报错。
- XML技术中,可以编写一个文档来约束一个XML的书写规范,这个文档称之为
约束
。 - 两个概念:
- 格式良好的XML:遵循XML语法的XML
- 有效的XML:遵循约束文档的XML
- 总之:约束文档定义了在XML中允许出现的元素名称 属性、及元素出现的顺序等等。
常用的XML约束技术
- XML DTD
- XML Schema
DTD的约束
- 快速入门
将DTD与XML文档关联三种方式
方式一: 使用内部DTD:可以在XML的文件中直接书写DTD的代码。(经常使用)
<!DOCTYPE 根节点 [ DTD的代码 ]>
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)>]>// xml代码:<书架> <书> <书名>Java就业培训教程</书名> <作者>张孝祥</作者> <售价>39.00元</售价> </书> ...</书架>
方式二:使用本地DTD
<!DOCTYPE 根节点 SYSTEM “DTD的地址” >
方式三: 使用网络DTD
<!DOCTYPE 根节点 PUBLIC “DTD的名称” “DTD的地址” >
元素定义
在DTD文档中使用
ELEMENT
关键字来声明一个XML元素。语法:
<!ELEMENT 元素名称 元素类型>
- 元素类型
(#PCDATA)
指示元素的主体内容只能是普通的文本.(Parsed Character Data)EMPTY
用于指示元素的主体为空。比如<br/>
ANY
用于指示元素的主体内容为任意类型。(子元素)
指示元素中包含的子元素- 子元素之间的关系
,
子元素出现是有顺序的,必须按照声明顺序去编写XML文档。|
子元素只能出现一个,任选其一- 子元素出现的次数
+
子元素出现1次或多次*
子元素出现0次或多次?
子元素出现0次或1次
- 子元素之间的关系
- 元素类型
<!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>
属性定义(AttributeList)
- 写法:
<!ATTLIST 元素名称 属性名称 属性类型 属性约束 属性名称 属性类型 属性约束 >
属性值类型:
CDATA
:表示属性的取值为普通的文本字符串ENUMERATED
(DTD没有此关键字):表示枚举,只能从枚举列表中任选其一,如(鸡肉|牛肉|猪肉|鱼肉)ID
:表示属性的取值不能重复(不能只写数字)
设置说明
#REQUIRED
:表示该属性必须出现#IMPLIED
:表示该属性可有可无#FIXED
:表示属性的取值为一个固定值。语法:#FIXED "固定值"
直接值
:表示属性的取值为该默认值
<!ATTLIST 页面作者 姓名 CDATA #IMPLIED 年龄 CDATA #IMPLIED 联系信息 CDATA #REQUIRED 网站职务 CDATA #FIXED "页面作者" 个人爱好 CDATA "上网" >
实体定义(用的不多)
- 实体用于为一段内容创建一个别名,以后在XML文档中就可以使用别名引用这段内容了。
- 在DTD定义中,一条
<!ENTITY …>
语句用于定义一个实体。 <!ENTITY 别名 “值”>
在元素中引用
&别名
;<!ENTITY 别名 "值" >
- 需要在xml中引入别名,浏览器打开文件后,在引入的位置上显示值的。
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE 书架 [ <!ELEMENT 书架 (书+)> <!ELEMENT 书 (书名,作者,售价,简介)> <!ELEMENT 书名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售价 (#PCDATA)> <!ELEMENT 简介 (#PCDATA)> <!ATTLIST 书 出版社 (清华出版社|人民出版社) #REQUIRED 编号 ID #IMPLIED 出版日期 CDATA #FIXED "2014-11-17" > <!ENTITY username "张三" >]><书架> <书 出版社="清华出版社" 出版日期="2014-11-17"> <书名>javaweb开发大全</书名> <作者>&username;</作者> <售价>99.8元</售价> <简介>这是不错啊</简介> </书> <书 编号="b1" 出版社="人民出版社"> <书名>葵花宝典</书名> <作者>岳不群</作者> <售价>99.8两</售价> <简介>欲练此功...</简介> </书></书架>
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE TVSCHEDULE [ <!ELEMENT TVSCHEDULE (CHANNEL+)> <!ELEMENT CHANNEL (BANNER,DAY+)> <!ELEMENT BANNER (#PCDATA)> <!ELEMENT DAY (DATE,(HOLIDAY|PROGRAMSLOT+)+)> <!ELEMENT HOLIDAY (#PCDATA)> <!ELEMENT DATE (#PCDATA)> <!ELEMENT PROGRAMSLOT (TIME,TITLE,DESCRIPTION?)> <!ELEMENT TIME (#PCDATA)> <!ELEMENT TITLE (#PCDATA)> <!ELEMENT DESCRIPTION (#PCDATA)> <!ATTLIST TVSCHEDULE NAME CDATA #REQUIRED> <!ATTLIST CHANNEL CHAN CDATA #REQUIRED> <!ATTLIST PROGRAMSLOT VTR CDATA #IMPLIED> <!ATTLIST TITLE RATING CDATA #IMPLIED> <!ATTLIST TITLE LANGUAGE CDATA #IMPLIED>]><TVSCHEDULE NAME=""> <CHANNEL CHAN=""> <BANNER>CCAV</BANNER> <DAY> <DATE>2014-11-17</DATE> <PROGRAMSLOT> <TIME>19:00</TIME> <TITLE>新闻联播</TITLE> </PROGRAMSLOT> </DAY> </CHANNEL></TVSCHEDULE>
解析XML
XML解析方式分为两种:DOM方式和SAX方式
DOM
:Document Object Model,文档对象模型。这种方式是W3C推荐的处理XML的一种方式。SAX
:Simple API for XML。这种方式不是官方标准,属于开源社区XML-DEV,几乎所有的XML解析器都支持它。- 区别:
- DOM解析XML
- 在内存中形成树状结构
- 缺点:如果文档过大,容易产生内存溢出的问题。
- 优点:方便做增删改的操作
- SAX解析
- 基于事件驱动,边读边解析
- 优点:不会产生内存溢出问题。
- 缺点:不能做增删改操作。(DOM4J在内存生成树状结构,可以做增删改操作)
- DOM解析XML
XML解析开发包
JAXP
:是SUN公司推出的解析标准实现。Dom4J
:是开源组织推出的解析开发包。(牛,大家都在用,包括SUN公司的一些技术的实现都在用)JDom
:是开源组织推出的解析开发包。
JAXP解析包
JAXP
:(Java API for XML Processing)开发包是JavaSE
的一部分,它由以下几个包及其子包组成:org.w3c.dom
:提供DOM方式解析XML的标准接口org.xml.sax
:提供SAX方式解析XML的标准接口javax.xml
:提供了解析XML文档的类javax.xml.parsers
包中,定义了几个工厂类。我们可以通过调用这些工厂类,得到对XML文档进行解析的DOM和SAX解析器对象。- DocumentBuilderFactory
- SAXParserFactory
DOM编程
DOM模型(document object model)
DOM解析器在解析XML文档时,会把文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。
在dom中,节点之间关系如下:
- 位于一个节点之上的节点是该节点的
父节点(parent)
- 一个节点之下的节点是该节点的
子节点(children)
- 同一层次,具有相同父节点的节点是
兄弟节点(sibling)
- 一个节点的下一个层次的节点集合是
节点后代(descendant)
- 父、祖父节点及所有位于节点上面的,都是节点的
祖先(ancestor)
节点类型Node对象
- Node对象提供了一系列常量来代表结点的类型,当开发人员获得某个Node类型后,就可以把Node节点转换成相应的节点对象(Node的子类对象),以便于调用其特有的方法。(查看API文档)
- Node对象提供了相应的方法去获得它的父结点或子结点。编程人员通过这些方法就可以读取整个XML文档的内容、或添加、修改、删除XML文档的内容了。
DOM方式解析XML文件
javax.xml.parsers
包中的DocumentBuilderFactory
用于创建DOM模式的解析器对象 , DocumentBuilderFactory是一个抽象工厂类,它不能直接实例化,但该类提供了一个newInstance方法
,这个方法会根据本地平台默认安装的解析器,自动创建一个工厂的对象并返回。JAXP 在DOM方式下解析HTML使用的类和方法
- 获取解析器工厂类 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
- 获取解析器对象:DocumentBuilder builder = factory.newDocumentBuilder();
- 解析XML的文档,返回document对象:Document document = builder.parse(“src/book2.xml”);
- 通过
document.getElementsByTagName(“”)
可以获取节点集合
返回NodeList
- 通过
Document.createElement(“”)
可以创建元素对象
。 - Node对象中可以设置文本内容
setTextContent()
- 通过Node的
appendChild()方法
加入子节点。 - 需要把内存中的
DOM树形结构
回写到xml文件中。 TransformerFactory
工厂类创建Transformer
回写类,通过transform(Souuce,Result)
方法回写xml。New DOMSource(document)
和new StreamResult(xml)
回写完成。
更新XML文档
javax.xml.transform包
中的Transformer类
用于把代表XML文件的Document对象转换为某种格式后进行输出- 例如把xml文件应用样式表后转成一个html文档。利用这个对象,当然也可以把Document对象又重新写入到一个XML文件中。
Transformer类
通过transform方法
完成转换操作,该方法接收一个源和一个目的地。我们可以通过:javax.xml.transform.dom.DOMSource类
来关联要转换的document对象,- 用
javax.xml.transform.stream.StreamResult
对象来表示数据的目的地。
Transformer
对象通过TransformerFactory获得
。
//book2.xml<书架> <书 编号="b2"> <书名>javaweb开发大全</书名> <作者>班长</作者> <售价>99.8元</售价> <简介>这是不错啊</简介> </书> <书> <书名>葵花宝典</书名> <作者>岳不群</作者> <售价>99.8两</售价> <简介>欲练此功...</简介> </书></书架>//JaxpDomTest.javapackage cn.itcast.jaxp;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import cn.itcast.utils.JaxpDomUtil;/** * JAXP的DOM解析XML * @author Administrator * */public class JaxpDomTest { public static void main(String[] args) { try { run3(); } catch (Exception e) { e.printStackTrace(); } } /** * 获取作者的文本内容 * @throws Exception */ public static void run1() throws Exception{ // 获取解析器工厂类 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 获取解析器对象 DocumentBuilder builder = factory.newDocumentBuilder(); // 解析XML的文档,返回document对象 Document document = builder.parse("src/book2.xml"); // 获取作者元素对象的集合,返回NodeList NodeList nodeList = document.getElementsByTagName("作者"); // 循环遍历,拿到每一个作者,打印文本的内容,getTextContent() for(int i=0;i<nodeList.getLength();i++){ Node node = nodeList.item(i); System.out.println(node.getTextContent()); } } /** * 需求:在第二本下,在末尾添加子节点 * @throws Exception */ public static void run2() throws Exception{ // 获取工厂类 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 获取解析器 DocumentBuilder builder = factory.newDocumentBuilder(); // 解析xml,返回document对象 Document document = builder.parse("src/book2.xml"); // 获取第二本书 Node book2 = document.getElementsByTagName("书").item(1); // 创建元素对象 Element cat = document.createElement("猫"); // 设置文本内容 cat.setTextContent("我是猫"); // 把元素对象添加到第二本书下 book2.appendChild(cat); // 回写 // 创建回写类的工厂 TransformerFactory transformerFactory = TransformerFactory.newInstance(); // 获取回写类 Transformer transformer = transformerFactory.newTransformer(); // 调用回写的方法 transformer.transform(new DOMSource(document), new StreamResult("src/book2.xml")); } /** * 删除节点 * @throws Exception */ public static void run3() throws Exception{ String path = "src/book2.xml"; // 获取文档对象 Document document = JaxpDomUtil.getDocument(path); // 获取猫 Node cat = document.getElementsByTagName("猫").item(0); // 获取书(猫的父节点) Node book2 = cat.getParentNode(); // 通过书删除猫 book2.removeChild(cat); // 回写 JaxpDomUtil.writeXML(document, path); }}
JAXP 的封装和删除
package cn.itcast.utils;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import javax.xml.transform.Transformer;import javax.xml.transform.TransformerFactory;import javax.xml.transform.dom.DOMSource;import javax.xml.transform.stream.StreamResult;import org.w3c.dom.Document;/** * JAPTDOM解析的工具类 * @author Administrator * */public class JaxpDomUtil { /** * 通过path获取document对象 * @param path * @return * @throws Exception */ public static Document getDocument(String path) throws Exception{ // 获取工厂类 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 获取解析器对象 DocumentBuilder builder = factory.newDocumentBuilder(); // 解析xml return builder.parse(path); } /** * 回写方法 * @param document * @param path * @throws Exception */ public static void writeXML(Document document,String path) throws Exception{ // 获取回写类的工厂 TransformerFactory factory = TransformerFactory.newInstance(); // 获取回写类 Transformer transformer = factory.newTransformer(); // 回写 transformer.transform(new DOMSource(document), new StreamResult(path)); }}
- Java进阶学习第五天——XML入门
- MySQL快速入门(一)—Java进阶学习第十五天
- java学习总结——第五天
- Java进阶学习第一天——HTML入门
- Java进阶学习第八天——WEB入门
- Java进阶学习第九天——Servlet入门
- 学习JAVA第五天
- Java学习第五天
- JAVA 学习第五天
- 学习JAVA第五天
- JAVA学习第五天
- java学习第五天
- java学习第五天
- JAVA学习第五天
- JAVA学习第五天
- java学习第五天
- Java学习第五天
- java学习第五天
- java基础之try-catch-finally
- 解决Spring MVC 对AOP不起作用的问题
- Linux性能测试命令系列(1)- top
- Linux C++的多线程编程
- 第一个ShaderToy——画圆、方、三角
- Java进阶学习第五天——XML入门
- java 虚拟机运行时内存分布分析
- wpa_supplicant 中文SSID连接不上
- 分页
- c语言中malloc、realloc与calloc 的区别以及联系
- Jsp的四大域对象
- 轴振动和轴承振动的区别
- java中的类和对象
- 小细节——java