天天看點

xml基礎和jaxp操作筆記

一.表單送出方式

* 使用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中的特殊字元

< &lt;

> &gt;

""  &quot;

''  &apos;

& &amp;

九.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);

}

}