一.表單送出方式
* 使用button送出代碼
//實作送出方法
function form1(){
//擷取form
var form2 = document.getElementById("form1");
//設定action
form2.action="hello.html";
//送出form表單
form2.submit();
}
* 使用超連結
<a herf="hello.html?username=123456">使用超連結送出</a>
* onclick 滑鼠點選事件
* onchange 改變内容 和select一起使用
* onfocus 得到焦點
* onblur 失去焦點
<input type="text" id="id1" value="please enter" name="text1" οnfοcus="focus1();" οnblur="blur1();"/>
function focus1(){
var input1 = document.getElementById("id1");
input1.value="";
}
function blur1(){
var input1 = document.getElementById("id1");
input1.value="please enter";
}
二.xml的簡介
* eXtensible Markup Language:可擴充标記語言
- 使用标簽來操作
- 可擴充
- HTML裡面的标簽固定,每一個标簽都有一個特定的含義
- 标簽自己定義,可以寫中文的标簽
* 用途
** HTML是用于顯示資料,xml也可以顯示資料
** xml的主要功能适用于存儲資料
三.xml的應用
* 不同的系統之間傳輸資料
* 用來表示生活中有關系的資料
* 經常配置檔案
四.xml的文法
1.xml的文檔聲明
* 建立一個檔案 字尾名師 .xml
* 如果寫xml,必須寫文檔聲明
- <?xml version="1.0" encode="gbk"?>
** 必須寫第一行的第一列
- 屬性
- version:版本 使用1.0
- encoding: utf-8 gbk ios8859-1(不包含中文)
- standalone:是否依賴其他檔案 yes/no
- xml亂碼解決
設定的編碼和儲存的編碼要一緻
2.定義元素(标簽)
3.定義屬性
4.注釋
5.特殊字元
6.CDATA
7.PI指令
五.xml與元素的定義
* 标簽的定義有開始必須要有結束
* 标簽沒有内容可以在标簽内結束:<aa/>
* 标簽可以嵌套,但是必須合理嵌套
** 合理 <a><b></b></a>
** 不合理 <a><b></a></b>
* 一個xml中,隻能有一個根标簽,其他的标簽隻能是他的子标簽
* 在xml中,它會把我們的空行和空格都解析
** 下面的代碼含義是不一樣的
- <a>1111</a>
- <b>
1111
</b>
* 命名的規則
1.區分大小寫
2.标簽不能使用數字和下劃線(_)開頭
3.不能使用xml、 XML 、Xml 等開頭
4.xml标簽不能包含空格和冒号
<a a><a:a>:這些都是不正确的
* xml的标簽可以是中文
六.xml的屬性定義
* <person id1="aaa"></person>
* 屬性定義要求
1.一個标簽可以有多個屬性
2.屬性名稱不能相同
3.屬性值必須用單引号和雙引号包裹起來,屬性名稱和屬性值之間使用 =
4.xml屬性的名稱規範和元素的名稱規範一緻
七.xml的注釋
* 寫法<!-- xml的注釋-->
* 注意:
注釋不能嵌套
* 注釋不能放在第一行
八.xml中的特殊字元
< <
> >
"" "
'' '
& &
九.CDATA區(了解)
* 可以解決多個需要轉義的操作if(a>b && b<c)
* 把這些内容放在CDATA區
** 寫法
<![CDATA[ 内容 ]]>
<![CDATA[<b>if(a>b && b<c</b>]]>
十.PI指令(處理指令)
* 可以再xml中設定樣式
* 寫法 <?xml-stylesheet type="text/css" herf="名稱.css"?>
-注意:它隻能在英文标簽起作用,對于中文名稱不起作用
十一.xml的限制
* 為什麼使用限制?
** 比如有一個person的xml檔案,但是隻想儲存人的資訊,其他資訊過濾不顯示,需要限制
* xml限制:dtd限制和schema限制
十二.dtd的快速入門
* 建立一個檔案 檔案名.dtd
步驟:
- 看xml中有多少個元素,有幾個元素,就在dtd中寫幾個元素<!ELEMENT>
- 判斷元素是複雜元素還是簡單元素
複雜元素:有子元素
<!ELEMENT 元素名稱 (子元素)>
簡單元素
<!ELEMENT 子元素名稱(#PCDATA)>
- 需要引入dtd檔案
<!DOCTYPE 父元素 SYSTEM "檔案名.dtd">
** 案例:
檔案清單:book.xml
<?xml version="1.0" ?>
<!DOCTYPE 書架 SYSTEM "book.dtd">
<書架>
<書>
<書名>葵花寶典</書名>
<作者>東方不敗</作者>
<售價>100元</售價>
</書>
<書>
<書名>九陽神功</書名>
<作者>東方不敗</作者>
<售價>100元</售價>
</書>
</書架>
檔案清單:book.dtd
<!ELEMENT 書架(書)>
<!ELEMENT 書(書名,作者,售價)>
<!ELEMENT 書名(#PCDATA)>
<!ELEMENT 作者(#PCDATA)>
<!ELEMENT 售價(#PCDATA)>
** 打開xml檔案使用浏覽器打開,浏覽器隻是負責校驗xml文法,不負責校驗限制,使用工具校驗myeclipse
十三.dtd的三種引入方式
1.引入外部檔案
<!DOCTYPE 根元素名稱 SYSTEM "根檔案.dtd">
2.引入内部檔案
<!DOCTYPE 根元素名稱[
<!ELEMENT 書架(書)>
<!ELEMENT 書(書名,作者,售價)>
<!ELEMENT 書名(#PCDATA)>
<!ELEMENT 作者(#PCDATA)>
<!ELEMENT 售價(#PCDATA)>
]>
3.使用外部的dtd檔案(網絡上的dtd檔案)
<!DOCTYPE 根元素名稱 PUBLIC "DTD名稱" "DTD文檔的URL">
十四.使用dtd定義元素
* 文法 <!ELEMENT 元素名 限制>
* 簡單元素的三種類型:
***(#PCDATA) :限制name是字元串類型
***EMPTY:元素為空
***ANY:任意類型
* 複雜元素:
***<!ELEMENT 元素名稱(子元素)>:子元素隻能出現一次
*** 表示子元素出現的次數
+:表示一次或者多次 <!ELEMENT person(name+,sex)>
?:表示出現0次或者一次 <!ELEMENT person(name?,sex)>
*:表示0次或者多次 <!ELEMENT person(name*,sex)>
*** 子元素是用逗号隔開
— 逗号表示子元素出現的順序
*** 子元素用|隔開,表示隻能出現子元素的任意一個
十五.dtd定義屬性
* 文法
<!ATTLIST 屬性名 屬性類型 屬性限制>
- 屬性類型
** CDATA:字元串
--<!ATTLIST birthday
ID1 CDATA #REQURED
>
** 枚舉:隻能在一定範圍内出現值,但是隻能出現一次
--(aa|bb|cc)
-- 紅綠燈的效果
-- <!ATTLIST age
ID2 (AA|BB|CC) #REQURED
>
** ID:值隻能是字母和下劃線開頭
--<!ATTLIST age
ID3 ID #REQURED
>
- 屬性的限制
** #REQURED:屬性必須存在
** #IMPLIED:屬性可有可無
** #FOXED:表示一個固定值
-- #FOXED "AAA"
--<!ATTLIST sex
ID4 CDATA #FOXED "AAA"
>
** 直接值 不寫屬性就是直接值,寫了就是目前的屬性值
-- <!ATTLIST sex
ID4 CDATA "AAA"
>
--<!ATTLIST 頁面作者
姓名 CDATA #IMPLED
年齡 CDATA #IMPLED
聯系方式 CDATA #REQURED
網站職務 CDATA #FIXED "頁面作者"
個人愛好 CDATA "上網"
>
十六.實體的定義
* 文法 <!ENTITY 實體名稱 "實體值">
*** <!ENTITY TEST "HAHA">
*** 使用實體 &實體名稱; 比如&TEST;
** 注意:定義實體必須寫在dtd裡面
十七.xml的解析和簡介(寫到java代碼)(****重點)
* xml的解析方式(技術):dom和sax
dom方式解析優點:容易進行增删改查
缺點:容易記憶體溢出
sax解析采用事件驅動,邊讀邊解析
- 從上到下,一行一行的解析,解析到某一個對象,把對象傳回
- 優點:實作查詢,不會造成記憶體溢出
- 缺點:不能實作增删改查
** 不同的公司提供了 針對dom和sax方式的解析器,通過api方式提供
-- sun公司 jaxp
-- dom4j組織 dom4j(***實際開發中)
-- jdom 組織 jdom
十八.jaxp的api檢視
** jaxp是javase的一部分
** jaxp解析器在jdk中的javax.xml.parsers包裡面
-- dom:
-- DocumentBulider:解析器類
- 這是一個抽象類
- 方法:DocumentBuliderFactory.newDocumentBulider();
- 一個方法,可以解析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()
- 擷取父節點
NodeList
- getLength() 得到集合的長度
- item(int index) 下标擷取具體的長度
for(int i=0;i<list.getLength();i++){
list.item(i);
}
getTextContent();
-得到元素裡面的值
-- DocumentBuliderFactory :解析器工廠類
- 這是一個抽象類
--sax:
--SAXParsers:解析器類
--SAXParsersFactory:解析器工廠類
十九.使用jaxp操作節點
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<person>
<p1>
<name>jack</name>
<age>22</age>
<nv>女</nv></p1>
</person>
* 使用jaxp查詢節點
* 查詢xml中所有的name和age元素的值
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml傳回document
Document document = builder.parse("src/NewFile1.xml");
//擷取xml中的每一個對象
NodeList list = document.getElementsByTagName("age");
//周遊集合
for(int i=0; i<list.getLength();i++){
Node node = list.item(i);
String s = node.getTextContent();
System.out.println(s);
}
* 查詢xml中的第一個name值
1、建立解析器工廠
2、根據解析器建立解析器
3、解析xml得到document
4、得到所有的name元素
5、使用傳回集合 item,用下标擷取第一個元素
6、得到具體的值,使用getTextContent方法
//建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
//建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
//解析xml傳回document
Document document = builder.parse("src/NewFile1.xml");
//得到xml中所有的name元素的值,傳回的是一個集合
NodeList list = document.getElementsByTagName("name");
//擷取集合中的第一個name元素
Node node = list.item(0);
//擷取node的具體值
String s1 = node.getTextContent();
System.out.println(s1);
* 使用jaxp添加節點
* 在p1下面添加一個标簽屬性<sex>女</sex>
1、建立解析器工廠
2、根據解析器建立解析器
3、解析xml得到document
4、得到第一個p1。使用item下标得到
5、建立sex标簽 createElement
6、建立文本 createTextNode
7、把文本添加到sex下面 appendChild
8、把sex添加到第一個p1下面
9、回寫xml
// 建立解析器工廠
DocumentBuilderFactory builderFactory = DocumentBuilderFactory
.newInstance();
// 建立解析器
DocumentBuilder builder = builderFactory.newDocumentBuilder();
// 解析xml傳回document
Document document = builder.parse("src/NewFile1.xml");
// 得到p1标簽
NodeList list = document.getElementsByTagName("p1");
// 得到第一個p1下的最後一個元素
Node node = list.item(0);
// 建立nv标簽
Element nv1 = document.createElement("sex");
// 建立文本
Text text1 = document.createTextNode("女");
//把文本添加到标簽下
nv1.appendChild(text1);
// 把nv添加到node下
node.appendChild(nv1);
// 回寫xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));
* 使用jaxp修改節點
* 修改p1下面的sex内容
1、建立解析器工廠
2、根據解析器建立解析器
3、解析xml得到document
4、得到sex item方法
5、修改sex裡面的值 setTextContent方法
6、回寫xml
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 建立解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析xml傳回的是Document對象
Document document = documentBuilder.parse("src/NewFile1.xml");
// 得到sex
Node node = document.getElementsByTagName("sex").item(0);
// 修改
node.setTextContent("男");
// 回寫xml
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));
* 使用jaxp删除節點
* 删除p1下面的sex節點
1、建立解析器工廠
2、根據解析器建立解析器
3、解析xml得到document
4、得到sex元素
5、擷取sex的父節點 getParentNode
6、通過父節點删除sex節點 removeChild
7、回寫xml
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 建立解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析xml 傳回的是document對象
Document document = documentBuilder.parse("src/NewFile1.xml");
// 得到p1節點
Node node = document.getElementsByTagName("p1").item(0);
// 得到p1的父節點
Node node1 = node.getParentNode();
// 删除節點
node1.removeChild(node);
//回寫操作
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/NewFile1.xml"));
* 使用jaxp周遊節點
* 周遊節點,把所有的元素名稱列印出來
1、建立解析器工廠
2、根據解析器建立解析器
3、解析xml得到document
==========使用遞歸
4、得到根節點
5、得到根節點的子節點
6、得到根節點的子節點的子節點
// 周遊節點
public static void listElement() throws Exception{
// 建立工廠類
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// 建立解析器
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 解析xml 傳回 Document
Document document = documentBuilder.parse("src/NewFile1.xml");
list1(document);
}
private static void list1(Node node) {
// TODO Auto-generated method stub
// 判斷節點是否為元素
if(node.getNodeType() == Node.ELEMENT_NODE){
System.out.println(node.getNodeName());
}
//
NodeList list = node.getChildNodes();
// 周遊節點
for(int i=0;i<list.getLength();i++){
// 得到每一個節點
Node node2 = list.item(i);
list1(node2);
}
}