1.xml簡介
1.extensible Markup Language 可擴(kuò)展標(biāo)記型語言
- 標(biāo)記型語言:html都是使用標(biāo)簽
- 可擴(kuò)展型語言 html的標(biāo)簽都是固定的郑气,每個(gè)標(biāo)簽都有特定的含義
標(biāo)簽可以自己定義 可以寫中文標(biāo)簽
<person><person/> - 2.xml用途
html是用于顯示數(shù)據(jù)萍嬉,xml也可以顯示數(shù)據(jù)(不是主要功能)
xml主要功能乌昔,為了存儲(chǔ)數(shù)據(jù) - 3.xml是w3c組織發(fā)布的技術(shù)
- 4.xml有兩個(gè)版本 1.0 1.1
2.xml應(yīng)用
-
不同的系統(tǒng)之間傳輸數(shù)據(jù)
用于表示生活中有關(guān)系的數(shù)據(jù)
經(jīng)常用在配置文件
如果要修改數(shù)據(jù)庫信息,不需要修改源代碼壤追,只需要修改配置文件就可以了
3.xml的語法
1.xml的文檔聲明
- 創(chuàng)建一個(gè)文件后綴名為.xml
- 如果寫 xml磕道,必須要有一個(gè)文檔聲明
<?xml version="1.0" encoding="utf-8"?>
文檔聲明必須寫在第一行第一列
屬性
version xml 的 版本 1.0
encoding xml 編碼 gbk utf-8
standalone 是否需要依賴其他文件
yes/no (不常用)
2.定義元素(標(biāo)簽)標(biāo)簽定義必須有開始,有結(jié)束
標(biāo)簽沒有內(nèi)容行冰,可以在標(biāo)簽內(nèi)結(jié)束 例如: <abc/>
標(biāo)簽可以嵌套,必須要合理嵌套
一個(gè) xml中只有一個(gè)根標(biāo)簽溺蕉,其他標(biāo)簽都是都是這個(gè)標(biāo)簽下面的標(biāo)簽
xml 中把空格和換行都當(dāng)成內(nèi)容來解析
下面兩段代碼的含義是不相同的
<bb>11111</bb>
<bb>
11111
</bb>
- xml 的命名規(guī)則
- 區(qū)分大小寫
- 不能以數(shù)字伶丐,下劃線開頭
- 不能以 xml XML Xml 開頭
<xmla>,<XMLb> 這些都不正確 - 不能包含空格和冒號(hào)
3.定義屬性 - 一個(gè)標(biāo)簽上可以有多個(gè)屬性
<persion id1='aaa' id2='bbb'> </persion>
- 屬性名稱不能相同
<persion id1='aaa' id1='bbb'> </persion>
錯(cuò)誤,不能有兩個(gè)id1
- 屬性名稱與屬性值之間要用=“屬性值”(引號(hào)可為單引號(hào)或者雙引號(hào))
- xml 屬性的名稱規(guī)范和標(biāo)簽的屬性規(guī)范一致
4.注釋
<!-- -->
- 注釋不能嵌套
-
注釋不能放在第一行疯特,第一行必須放文檔聲明
5.特殊字符
6.CDATA區(qū)
- 可以解決有多個(gè)字符都需要轉(zhuǎn)義的操作 if(a<b && b<c && d>f) {}
- 把這些內(nèi)容放到CDATA區(qū)里面哗魂,不需要轉(zhuǎn)義
寫法
<! [ CDATA [ 內(nèi)容 ] ] >
把特殊字符當(dāng)成文本顯示
7.PI指令(處理指令)
- 可以在xml中設(shè)置樣式
寫法
<?xml-stylesheet type="text/css" href="name.css"?>
-
設(shè)置樣式只能對(duì)英文標(biāo)簽起作用,對(duì)中文標(biāo)簽不起作用漓雅。
8.xml語法的總結(jié)
- 所有xml元素都必須有關(guān)閉標(biāo)簽
- xml標(biāo)簽對(duì)大小寫敏感
- xml必須正確的嵌套順序
- xml文檔必須有跟元素
- xml的屬性必須加引號(hào)
- 特殊字符必須轉(zhuǎn)義——CDATA
- xml 中的空格录别,回車換行會(huì)解析是被包留
2.xml的約束
- 為什么需要約束?
比如現(xiàn)在定義一個(gè)person的xml文件邻吞,只要這個(gè)文件里保存人的信息组题,比如name,age等抱冷,但是如果在xml文件中寫了一個(gè)標(biāo)簽<貓><貓/>崔列,發(fā)現(xiàn)可以正常顯示,因?yàn)榉险Z法規(guī)范但是貓肯定不是人的信息旺遮,xml的標(biāo)簽是自定義的需要字?jǐn)?shù)來規(guī)定 - xml的約束技術(shù)
DTD約束與schema約束
1.DTD快速入門
創(chuàng)建一個(gè)文件 后綴名 .dtd
步驟
- 1.看xml中有多少個(gè)元素峻呕,在dtd文件中寫幾個(gè)<!ELEMENT>
- 2.判斷元素是簡單元素還是復(fù)雜元素
-簡單元素:沒有子元素
<!ELEMENT 元素名稱(#PCDATA)>
-復(fù)雜元素:有子元素的元素
<!ELEMENT 元素名稱(元素名稱)> - 3.需要在xml文件中引入DTD文件
<!DOCTYPE 根元素名稱 SYSTEM "DTD文件路徑">
打開xml文件使用瀏覽器打開,瀏覽器只負(fù)責(zé)校驗(yàn)xml的語法趣效,不負(fù)責(zé)校驗(yàn)約束
如果想要校驗(yàn)xml的約束,需要實(shí)用工具(myeclipse工具)
創(chuàng)建一個(gè)項(xiàng)目 day05
在day05的目錄下創(chuàng)建一個(gè)xml文件和dtd文件
在xml中引入dtd文件之后多寫一個(gè)標(biāo)簽之后多寫了一個(gè)a猪贪,會(huì)提示出錯(cuò)
DTD的三種引入方式
- 1引入外部dtd文件
<!DOCTYPE 根元素名稱 SYSTEM "DTD文件路徑">
-
2.使用內(nèi)部的DTD文件
- 3.使用網(wǎng)絡(luò)的DTD文件
<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文檔的UPL">
-后面學(xué)到框架 struts2 使用配置文件 使用外部dtd
使用DTD定義元素
語法
<!ELEMENT 元素名 約束>
- 簡單元素 沒有子元素的元素
<!ELEMENT 元素名稱(#PCDATA)>
(#PCDATA)
:約束name是字符串類型
EMPTY
:元素為空(沒有內(nèi)容)
ANY
:元素可以任意
- 復(fù)雜元素:
<!ELEMENT person (name,age,sex,school)>
-子元素只能出現(xiàn)一次
<!ELEMENT 元素名稱 (子元素)>
<!ELEMENT person (name+,age?,sex*,school)>
+:表示1次或者多次
?:表示出現(xiàn)0次或者1次
*:表示0次或者多次
子元素直接使用逗號(hào)隔開:順序不可顛倒
子元素直接使用豎線隔開:只能出現(xiàn)子元素中其中一個(gè)
使用DTD定義屬性
語法
:
<!ATTLIST 元素名稱
屬性名稱 屬性類型 屬性的約束>
- 屬性類型
-CDATA 字符串類型
<!ATTLIST brith
ID1 CDATA #REQUIRED>
-枚舉:只能在一定范圍內(nèi)出現(xiàn)值跷敬,但是只能每次出現(xiàn)一種值
紅路燈的效果
(aa|bb|cc)
<!ATTLIST age
ID2 (AA|BB|CC) #REQUIRED>
-ID:值只能是字母或者下劃線開頭
<!ATTLIST name
ID3 ID #REQUIRED>
- 屬性的約束
#REQUIRED
:屬性必須要有
#IMPLIED
:屬性可有可無
#FIXED
:表示一個(gè)固定的值 #FIXED "ABC"
<!ATTLIST sex
ID4 CDATA #FIXED "XBW">
-直接值
不寫屬性,使用直接值
寫屬性热押,使用寫的屬性值
<!ATTLIST school
ID5 CDATA "WWW">
實(shí)體的定義
語法
:
<!ENTITY 實(shí)體名稱 "實(shí)體的值">
<!ENTITY TEST "NIHAO">
使用實(shí)體
:&實(shí)體名稱;
注意
:一般寫在外部dtd文件內(nèi)
實(shí)例
xml解析簡介(寫到j(luò)ava代碼)****
- xml標(biāo)記型文檔
- js使用dom解析標(biāo)記文檔
-根據(jù)html的層級(jí)結(jié)構(gòu)西傀,在內(nèi)容中分配一個(gè)書型結(jié)構(gòu),把html的標(biāo)簽桶癣,屬性和文本都封裝成對(duì)象
-doucoment element 屬性對(duì)象 文本對(duì)象 屬性和文本都封裝成對(duì)象 -
xml的解析方式(技術(shù)):dom 和 sax
- dom方式解析
-根據(jù)xml的層級(jí)結(jié)構(gòu)在內(nèi)容中分配一個(gè)樹形結(jié)構(gòu)拥褂,把xml的標(biāo)簽,屬性和文本都封裝成對(duì)象
-缺點(diǎn):內(nèi)容過大造成內(nèi)存溢出
-優(yōu)點(diǎn):很方便實(shí)現(xiàn)增刪改操作 - sax方式解析:
-采用事件驅(qū)動(dòng)牙寞,邊讀邊解析
從上到下饺鹃,一步一步解析,解析到某一個(gè)對(duì)象间雀,返回對(duì)象名
-缺點(diǎn):不能實(shí)現(xiàn)增刪改操作
-優(yōu)點(diǎn):如果文件過大悔详,不會(huì)造成內(nèi)存溢出,方便實(shí)現(xiàn)查詢操作
jaxp的dpi的查看
jaxp是javase的一部分
- jaxp解析器在jdk的javax.xml.parse包里面
四個(gè)類:分別是針對(duì) dom和 sax 解析使用的類
- dom:
documentBuilder
:解析器類
1.這個(gè)類是一個(gè)抽象類惹挟,不能 new
此類的實(shí)例可以從 DocumentBuilderFactory.newDocumentBuilder()
方法獲取
2.一個(gè)方法茄螃,可以解析 xml parse(“xml 路徑”)返回是 Document 整個(gè)文檔
3.返回的 document 是一個(gè)接口,父節(jié)點(diǎn)是 Node 连锯,如果在 document里面找不到想要的方法归苍,到 Node 里面去找
4.在document
里面方法
getElementsByTagName(String tagname)
——這個(gè)方法可以得到標(biāo)簽
返回集合NodeList
createElements(String tagname)
——?jiǎng)?chuàng)建標(biāo)簽
createTextNode(String data)
——?jiǎng)?chuàng)建文本
appendChild(Node oldchild)
——把文本添加到標(biāo)簽下面
removechild(Node oldchild)
——?jiǎng)h除節(jié)點(diǎn)
getparentNode()
——獲取父節(jié)點(diǎn)
NodeList
—getLength()
得到集合的長度
—item (int index)
下標(biāo)取到具體的值
遍歷:
for(int i=0;i<list.getLength();i++){
list.item(i);
}
DocumentBuilderFactory:解析器工廠
——這個(gè)類也是一個(gè)抽象類用狱,不能 new
newInstance () 獲取 DocumentBuildertory 的實(shí)例。
sax :
SAXParser:解析器類
SAXParserFactory:解析器工廠
使用jaxp查詢所有name元素的值
1.創(chuàng)建解析器工廠
DocumentBuilderFactory buliderFactory = DocumentBuilderFactory.newInstance();
2.根據(jù)解析器工廠解析解析器
DocumentBuilder builder = builderFactory.newDocumentBilder();
3.解析xml返回document
Document document = bulider.parse("src/person.xml");
4.得到所有的name元素
NodeList list = document.getElementsByTagName("name");
5.遍歷集合得到每一個(gè)那么元素
for(int i = 0;i<list.getLength();i++){
Node name1 = list.item(i);
String s = name1.getTextContent();
System.out.println(s);
}
使用 jaxp 添加節(jié)點(diǎn)
在第一個(gè) p1 下面(末尾) 添加<sex>nv</sex>
步驟:
1.創(chuàng)建解析器工廠
2.根據(jù)解析器工廠創(chuàng)建解析器
3.解析 xml 拼弃,返回 document
4.得到第一個(gè) p1
——得到所有 p1 夏伊,使用 item 方法下標(biāo)得到
5.創(chuàng)建 sex 標(biāo)簽 createTextNode
6.創(chuàng)建文本 createTextNode
7.把文本添加到 sex 下面 appendChild
8.把 sex 添加到第一個(gè) p1 下面 appendChild
9.回寫 xml
使用 jaxp 修改節(jié)點(diǎn)
修改 第一個(gè) p1 下面的sex內(nèi)容是nan
步驟:
1.創(chuàng)建解析器工廠
2.根據(jù)解析器工廠創(chuàng)建解析器
3.解析 xml ,返回 document
4.得到 sex item 方法
5.修改sex里面的值 ——setTextContent方法
6.回寫 xml
//回寫 xml
TransformerFactory transformerFactory=TransformerFactory .newInstance();
Tranaformer transformer=transformerFactory.new Transformer();
transformer .transform(new DOMSource(document),new StreamResult("src/person.xml");
使用 jaxp 刪除節(jié)點(diǎn)
刪除 <sex>nan</sex>節(jié)點(diǎn)
步驟:
1.創(chuàng)建解析器工廠
2.根據(jù)解析器工廠創(chuàng)建解析器
3.解析 xml 肴敛,返回 document
獲取 sex 元素
5.獲取 sex 的父節(jié)點(diǎn) 使用 getParentNode 方法
6.刪除使用父節(jié)點(diǎn) removechild 方法
7.回寫 xml
使用 jaxp 遍歷節(jié)點(diǎn)
步驟:
1.創(chuàng)建解析器工廠
2.根據(jù)解析器工廠創(chuàng)建解析器
3.解析 xml 署海,返回 document
4.得到根節(jié)點(diǎn)
5.得到根節(jié)點(diǎn)子節(jié)點(diǎn)
6.得到根節(jié)點(diǎn)子節(jié)點(diǎn)的子節(jié)點(diǎn)
遍歷的方法:
private static void list1(Node node){
//判斷是元素類型的時(shí)候才打印
if(node.getNodeType()==Node,ELEMENT_NODE){
System.out.println(node.getNodeName());
}
//得到一層子節(jié)點(diǎn)
NodeList list =node.getChildNodes();
//遍歷 list
for(int i=0;i<list.getLength();i++)
//得到某一個(gè)節(jié)點(diǎn)
Node node1 =list.item(i)医男;
//node1.getChildNodes()
list1(node1)砸狞;
}