案例:动态生成表格
<html>
<head>
<title></title>
<style type="text/css"></style>
</head>
<body>
行<input type="text" id="h"/>
列<input type="text" id="l"/>
<input type="button" value="生成" onclick="add2();"/>
<div id="divv"></div>
</body>
<script>
function add2(){
var h = document.getElementById("h").value;
var l = document.getElementById("l").value;
var divv = document.getElementById("divv");
var tab="<table>";
for(var i=0;i<h;i++){
tab +="<tr>";
for(var j=0;j<l;j++){
tab+="<td>AAAAAA</td>";
//alert(tab);
}
tab +="</tr>";
}
tab+="</table>";
//alert(tab);
divv.innerHTML=tab;
}
</script>
</html>
XML
表单提交方式
button action=页面 submit()
onclick
onchange 改变内容 select
onfocus 得到焦点
onblur 逝去焦点
XML可扩展标记型语言
-使用标签来操作
-标签可以自己定义
**主要功能,为了存储数据
不同系统之间传输数据
用来表示生活中有关系的数据
作为配置文件
文档声明
<?xml version="1.0" encoding="gbk"?>
必须第一行第一列
乱码问题解决:保存到本地硬盘,使用的gbk编码保存。浏览器打开xml文件,用设置的格式打开,码表对应值不一致所以导致乱码。(保存时的编码和打开时的编码一致,就不会出现乱码)
定义元素
有开始必须要结束<a></a>
没有内容可以在标签内结束<a/>
只能有一个根标签,其他标签都是这个标签的子标签或者孙标签
会把空格换行都当成内容解析
xml区分大小写(html不区分大小写)
不能以数字和下划线开头
标签不能以xml开头
标签不能包含空格和冒号:
可以是中文
定义属性
可以有多个属性
属性名不能相同
注释
<!-- 这是注释--> 注释显示成灰色
注释里面不能嵌套
特殊字符
转义
< <; (必须有分号)
> >;
CDATA区
<![CDATA[内容]]>
PI指令
设置样式
<?xml-stylesheet type="text/css" href="css的路径"?>
对中文标签不起作用
XML的约束
!!!(面试题)dtd约束 schema约束
dtd快速入门
创建dtd文件 后缀为.dtd
有几个元素写几个<!ELEMENT>
判断元素是简单元素还是复杂元素
-复杂元素 有子元素 <!ELEMENT 元素名称 (子元素)>
-简单元素没有子元素 <!ELEMENT 元素名称 (#PCDATA)> (一定是英文环境的括号)
需要在xml文件中引用dtd文件<!DOCTYPE 根元素名臣 SYSTEM "dtd文件的路径">
打开xml文件使用浏览器打开,浏览器只校验xml语法,不负责校验约束
dtd引入方式
<!DOCTYPE 根元素名称 SYSTEM “dtd路径”>
使用内部的dtd文件
使用外部的dtd文件 <!DOCTYPE 根元素名称 PUBLIC "DTD名称" "DTD的URL"> (Struts框架)
使用dtd定义元素
简单元素
-(#PCDATA)约束name是字符串类型
- EMPTY 元素为空(没有内容)
- ANY
复杂元素
-子元素只能出现一次
- + 表示一次或者多次
?表示零次或者一次
*任意次
- 逗号进行隔开表示元素出现的顺序
- 元素使用|隔开表示元素只能出现其中的任意一个
dtd定义属性
<!ATTLIST 元素名称
属性名称 属性类型 属性的约束
>
#REQUIRED 表示必须要出现
属性的类型
CDATA 字符串
枚举 表示只能在一定的范围内出现值,但是只能每次出现其中的一个
ID
属性的约束
- #REQUIRED 必须有
- #IMPLIED 可有可无
- #FIXED 表示一个固定的值,后面接你设定的固定值
- 直接值 你设定的默认值
dtd实体
<!ENTITY 实体名称 “实体的 值”>
使用实体 &实体名称;
需要些在内部dtd里面,如果写在外表dtd里面,有某些浏览器内容得不到
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE TVSCHEDULE SYSTEM "TV.dtd">
<TVSCHEDULE NAME="CCAV">
<CHANNEL CHAN="DJR">
<BANNER>tc</BANNER>
<DAY>
<DATE>2018</DATE>
<HOLIDAY>2018-8-13</HOLIDAY>
</DAY>
<DAY>
<DATE>2019</DATE>
<PROGRAMSLOT VTR="999">
<TIME>8-13</TIME>
<TITLE RATING="888" LANGUAGE="777">tacenee</TITLE>
</PROGRAMSLOT>
</DAY>
</CHANNEL>
</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>
**xml解析(写到java代码)
使用dom和sax解析过程 (解析技术,不是解析器)
js解析html文件 树形结构 标签,元素,文本封装成对象
dom (如果文件过大,造内存溢出。优点:方便实现增删改操作)
sax 采用事件驱动,边读边解析。从上到下,一行一行的解析,解析到某一个对象,把对象名称返回
(使用sax方式不会造成内存溢出,实现查询。 缺点:不能实现增删改操作)
解析器
jaxp
dom4j(*****实际使用***)
jdom
jaxp api
jaxp是javase的一部分
jaxp解析器是jdk的javax.xml.parsers包里面
四个类 分别针对dom和sax解析使用的类
-dom
DocumentBuilder 解析器类
抽象类,不能new 可以从DocumentBuilderFactory.newDocumentBuilder()方法获取
一个方法可以解析xml parse(“xml路径”) 返回是Document整个文档
返回的documen是一个接口,父节点是Node,如果在document里面找不到想要的方法,到Node里面找
nodeList getlength长度 item下标具体值
DocumentBuilderFactory解析器工厂
抽象类,不能new newInstance() 获取DocumentBuilderFactory的实例
第一个元素
public static void selectSin() throws Exception{
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder= builderFactory.newDocumentBuilder();
Document document = builder.parse("src/person.xml");
NodeList list = document.getElementsByTagName("name");
Node name1 = list.item(0);
String s = name1.getTextContent();
System.out.println(s);
}
全部元素
private static void selectAll() throws Exception {
DocumentBuilderFactory builderFoctory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFoctory.newDocumentBuilder();
Document document= builder.parse("src/person.xml");
NodeList list=document.getElementsByTagName("name");
for(int i =0;i<list.getLength();i++){
Node node = list.item(i);
String s =node.getTextContent();
System.out.println(s);
}
}
使用jaxp添加元素
public static void add1() throws Exception{
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = builderFactory.newDocumentBuilder();
Document document =builder.parse("src/person.xml");
NodeList list = document.getElementsByTagName("p1");
Node node1 = list.item(0);
Element name1 = document.createElement("sex");
Text text1 = document.createTextNode("man");
name1.appendChild(text1);
node1.appendChild(name1);
//回写操作,加入便签只是在内存中操作,还要写进文件
TransformerFactory factory = TransformerFactory.newInstance();
Transformer trans = factory.newTransformer();
trans.transform(new DOMSource(document),new StreamResult("src/person.xml"));
}
修改性别
private static void setSex() throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.parse("src/person.xml");
Node sex1 = document.getElementsByTagName("sex").item(0);
sex1.setTextContent("women");
TransformerFactory transformerFactory =TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
删除节点
private static void delectNode() throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document=documentBuilder.parse("src/person.xml");
Node sex1 = document.getElementsByTagName("sex").item(0);
Node p1 = sex1.getParentNode();
p1.removeChild(sex1);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/person.xml"));
}
遍历节点
private static void showElement() throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document=documentBuilder.parse("src/person.xml");
list1(document);
}
private static void list1(Node node) {
if(node.getNodeType()==node.ELEMENT_NODE){
String s =node.getNodeName();
System.out.println(s);
}
NodeList list = node.getChildNodes();
for(int i =0;i<list.getLength();i++){
Node node1 = list.item(i);
list1(node1);
}
}