一、XML入門
HTML:負責網頁的結構
CSS:負責網頁的樣式(美觀)
JavaScript:負責在瀏覽器端與用戶進行交互
HTML語言特點:(1)由標籤組成;(2)語法結構鬆散,不區分大小寫,結束標籤和開始標籤不一定匹配。
HTML與XML的區別:
(1) HTML(HyperTextMarkup Language)超文本標記語言,由標籤組成,標籤是由w3c組織制定,固定的;作用是負責網頁結構的。
(2) XML(ExtendMarkup language)可擴展標籤語言,標籤由開發者按照一定的語法定義自己制定的,作用是描述帶關係的數據(作爲軟件的配置文件)和作爲數據的載體(存儲數據,小型的”數據庫”)
二、XML語法:
xml文件以xml後綴名結尾。
xml文件需要使用xml解析器去解析。瀏覽器內置了xml解析器
三、標籤
3.1語法:
<student></student>開始標籤 標籤體內容 結束標籤
(1)<student/>或<student><student/>空標籤。沒有標籤體內容
(2)xml標籤名稱區分大小寫
(3)xml標籤一定要正確配對
(4)xml標籤名中間不能使用空格
(5)xml標籤名不能以數字開頭
(6)注意:在一個xml文檔中,有且僅有一個根標籤
3.2屬性
語法:<Studentname=”eric”>student</Student>
注意:
(1) 屬性值必須以引號包含,不能省略,也不能單雙引號混用!!!
(2) 一個標籤內可以有多個屬性,但不能出現重複的屬性名!!!
3.3註釋
語法:<!--註釋的內容 -->
3.4文檔聲明
語法:<?xmlversion=”1.0” encoding=”utf-8”?>
version:xml的版本號
encoding:解析xml文件時查詢的碼錶(解碼過程時查詢的碼錶)
注意:
如果在ecplise工具中開發xml文件,保存xml文件時自動按照文檔聲明的encoding來保存文檔
3.5轉義字符
在xml中內置了一些特殊字符,這些特殊字符不能直接被瀏覽器原樣輸出。如果希望把這些特殊字符按照原樣輸出到瀏覽器,對這些特殊字符進行轉義。轉義之後的字符就叫轉義字符
特殊字符 轉義字符
< <
> >
“ "
& &
空格
3.6 CDATA塊
作用:可以讓一些需要進行包含特殊字符的內容統一進行原樣輸出
<![CDATA[
<html><head>head</head><body>body</body></html>
]]>
3.7處理指令
作用:告訴xml解析器如何解析xml文檔
案例:<?xml-stylesheettype=”text/css” href=”1.css”?>告訴xml解析器該xml文檔引用了哪個css文件
需要提取xml內容可以使用xml-stylesheet指令
四、xml解析
4.1 引入
xml文件除了給開發者看,更多的情況是程序讀取xml文件的內容。這叫做xml解析
4.2 xml解析方式(原理不同)
DOM解析
SAX解析
4.3 xml解析工具
DOM解析原理:
(1)JAXP (oracle-Sun公司官方)
(2)JDOM工具(非官方)
(3)Dom4J工具(非官方)
三大框架(默認讀取xml的工具就是Dom4J)
SAX解析原理:
(1) SAX解析工具(oracle-Sun公司官方)
/*
BOM(瀏覽器對象編程)
DOM(文檔對象編程)JavaScript引擎把html文件中標籤封裝成各種對象
*/
xml解析器在解析xml文檔時,把xml文件的各個部分內容封裝成對象,通過這些對象操作xml文檔,這種做法叫做DOM解析(DOM編程)
Dom解析:
Document對象,代表一個完整的xml文檔
通過Document對象可以得到其下面的其他節點對象,通過節點對象訪問xml文檔的內容。(標籤,屬性,文本,註釋…)
4.4什麼是DOM解析
DOM解析原理:xml解析器一次性把整個xml文檔加載進內存,然後在內存中構建一棵Document的對象樹,通過Document對象,得到樹上的節點對象,通過節點對象訪問(操作)到xml文檔的內容
4.5 Dom4J工具
非官方,不在JDK內
使用步驟:
(1) 導入dom4j的核心包 dom4j-1.6.1.jar
(2) 編寫Dom4J讀取xml文件代碼
public static void main(String[] args) {
try {
//1、創建一個xml解析器對象
SAXReader reader = new SAXReader();
//2、讀取xml文檔,返回Document對象
Document document = reader.read(new File("./src/contact.xml"));
System.out.println(document);
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
throw new RuntimeException(e);
}
}
4.6Dom4j讀取xml文件
節點:
Iterator Element.nodeIterator(); //獲取當前標籤節點下的所有子節點
標籤:
Element Document.getRootElement(); //獲取xml文檔的根標籤
Element Element.element(“標籤名”);//指定名稱的第一個子標籤
Iterator<Element>Element.elementIterator(“標籤名”);//指定名稱的所有子標籤
List<Element> Element.elements();//獲取所有的子標籤
屬性:
String Element.attributeValue(“屬性名”);//獲取指定名稱的屬性值
Attribute Element.attribute(“屬性名”);//獲取指定名稱的屬性對象
Attribute.getName();//獲取屬性名稱
Attribute.getValue();//獲取屬性值
List<Attribute>Element.attributes();//獲取所有屬性對象
Iterator<Attribute> Element.attributeIterator();//獲取所有屬性對象
文本:
Element.getText();//獲取當前標籤的文本
Element.elementText(“標籤名”);//獲取當前標籤的指定名稱的子標籤的文本內容
五、總結:
5.1 xml作用
a) 作爲軟件配置文件(最常見)
b) 作爲小型的”數據庫”
5.2 xml語法(由w3c組織規定的)
標籤:
標籤名不能以數字開頭,中間不能由空格,區分大小寫,有且僅有一個根標籤
屬性:
可以有多個屬性,但是屬性值必須用引號(單引號或雙引號)包含,但不能省略,也不能單雙混用
文檔聲明:
<?xmlversion=”1.0” encoding=”utf-8”?>
Encoding=”utf-8”: 打開或解析xml文檔時的編碼
注意:
保存xml文檔時的編碼和解析xml文檔時的編碼要保持一致,才能避免中文亂碼問題!
5.3 xml解析(DOM解析)
程序讀取或操作xml文檔
兩種解析方式:DOM解析 VS SAX解析
DOM解析原理:一次性把xml文檔加載成Document樹,通過Document對象得到節點對象,通過節點對象訪問xml文檔內容(標籤,屬性,文本,註釋)。
5.4 Dom4j工具(基於DOM解析原理):
讀取xml文檔:
Document doc =new SAXReader().read(“xml文檔”);
節點:
nodeIterator(); //所有節點
標籤:
Element(“名稱”); //指定名稱的第一個子標籤對象
elementIterator(“名稱”); //指定名稱的所有子標籤對象
elements(); //所有子標籤對象
屬性:
attributeValue(“名稱”); //指定名稱的屬性值
attribute(“名稱”); //指定名稱的屬性對象
getName() //屬性名稱
getValue() //屬性值
attributeIterator() //所有屬性對象(Iterator)
attributes() //所有屬性對象(List)
文本:
getText() //得到文本
elementText(“子標籤名稱”) //得到字標籤的文本
day0709
六、Dom4j修改xml文檔
XMLWriterwriter = new XMLWriter(OutputStream,OutputFormat);
Writer.write(Document);
6.1修改xml文檔的API
增加:
DocumentHelper.createDocument(); //增加文檔
addElement(“名稱”); //增加標籤
addAttribute(“名稱”,”值”); //增加屬性
修改:
Attribute.setValue(“值”); //修改屬性值
Element.addAttribute(“同名的屬性名”,”值”);//修改同名的屬性值
Element.setText(“內容”); //修改文本內容
刪除:
Element.detach(); //刪除標籤
Attribute.detach(); //刪除屬性
七、xPath技術
7.1引入:
當使用Dom4j查詢比較深的層次結構的節點(標籤,屬性,文本),比較麻煩
7.2 xPath作用
主要用於快速獲取所需的節點對象
7.3在dom4j中如何使用xPath技術
(1)導如xPath支持jar包。Jaxen-1.1-beta-6.jar
(2)使用xPath方法
List<Node> selectNodes(“xPath的表達式”); //查詢多個節點對象
Node selectSingleNode(“xPath的表達式”); //查詢一個節點對象
7.3 xPath語法
/ 絕對路徑 表示從xml的根位置開始或子元素(一個層次結構)
// 相對路徑 表示不分任何層次結構的選擇元素
* 通配符 表示匹配所有元素
[] 條件 表示選擇什麼條件下的元素
@ 屬性 表示選擇屬性節點
and 關係 表示條件的與關係(等價於&&)
text() 文本 表示選擇文本內容
案例:
用戶登錄功能:
用戶輸入用戶名和密碼--à到”數據庫”查詢是否有對應的用戶--à
有:則表示登錄成功
沒有:則表示登錄失敗
用xml當做數據庫
user.xml 用來存儲用戶的數據
八、SAX解析
8.1 引入
DOM解析原理:一次性把xml文檔加載進內存中,然後在內存中構建Document樹。對內存要求比較高
缺點:不適合去讀取一些大容量的文件,容易導致內存溢出。
SAX解析原理:加載一點,讀取一點,處理一點,對內存的要求比較低。
8.2 SAX解析工具:
SAX解析工具:Sun公司提供的,內置在jdk中。org.xml.sax.*
核心的API:
SAXParse類:用於讀取和解析xml文件
parse(Filef,DefaultHandler dh);//方法,解析xml文件
參數一:File:表示讀取的xml文件
參數二:DefaultHandler:SAX事件處理程序。使用DefaultHandler的子類
DefaultHandler類的API:
void startDocument() : 在讀到文檔開始時調用
void endDocument() : 在讀到文檔結束時調用
void startElement(String uri,String localName,StringqName,Attributes attributes) : 讀到開始標籤時調用。
void endElement(String uri,String localName,String qName) : 讀到結束標籤時調用
void characters(char[] ch,int start,int length) : 讀到文本內容時調用
DOM解析 VS SAX解析
區別一:
DOM解析原理:一次性加載xml文檔,不適合大容量的文件讀取
SAX解析原理:加載一點,讀取一點,處理一旦,適合大容量文檔的讀取
區別二:
DOM解析可以任意進行增刪改查
SAX解析只能讀取
區別三:
DOM解析任意讀取任何位置的數據,甚至往回讀
SAX解析只能從上往下,按順序讀取,不能往回走
區別四:
DOM解析面向對象的編程方式(Node,Element,Attribute)Java開發者編碼比較簡單
SAX解析基於事件的編程方法。Java開發者比較難理解
九、總結:
9.1 Dom4j修改xml文檔
寫出xml文檔
XMLWriter writer = new XMLWriter();
Writer.write(doc); //寫出xml文檔
增加:
DocumentHelper.createDocument(); //增加新文檔
Element.addElement(“name”); //增加子標籤
Element.addAttribute(“name”,”value”) //增加屬性
修改:
Attribute.setValue(“value”); //修改屬性值
Element.setText(“value”); //修改文本內容
刪除:
Element.detach(); //刪除標籤
Attribute.detach(); //刪除屬性
9.2 xPath技術:快速找到xml(標籤,屬性,文本)
dom4j使用xpath:
List<node>list = Element.selectNodes(“xpath表達式”); //多個節點對象
Nodenode = Element.selectSingleNode(“xpath表達式”); //一個節點對象
9.3 xpath表達式語言
/ 表示根位置或者 子標籤
// 表示後代標籤(部分層次結構)
* 表示所有元素
[] 表示條件
@ 表示選擇屬性
text() 表示選擇文本
and 表示與條件
9.3 SAX解析:原理:加載一點,解析一旦,處理一點,對內存要求不高(基於事件)
SAXParser類:
parser(Filefile,DefaultHandler handler): 該方法使用SAX解析方式去解析xml文檔
DefaultHandler類:重寫該類中的一些方法,用於處理xml文檔
startElement(…String qName); //讀到開始標籤時調用
characters(char[] ch, int start,intlength); 讀到文本內容時調用(包括空格和換行)
endElement(….String qName); //讀到結束標籤時調用
十、xml約束
xml約束要求:大家能夠看懂約束內容,根據約束內容寫出符合規則的xml文件
xml語法:規範的xml文件的基本編寫規則(由w3c組織制定的)
xml約束:規範xml文件數據內容格式的編寫規則(由開發者自行定義)
10.1 xml約束技術:
DTD約束:語法相對簡單,功能相對簡單。學習成本低
Schema約束:語法相對複雜,功能也相對強大。學習成本相對高。(語法空間)
10.2 DTD約束:
導入dtd方式
內部導入
<!DOCTYPE note [
<!ELEMENTnote (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENTbody (#PCDATA)>
]>
外部導入
本地文件系統:
<!DOCTYPE note SYSTEM “note.dtd”>
公共的外部導入:
<!DOCTYPE 根元素 PBULIC http://gz.itcast.cn/itcast.dtd>
DTD語法
約束標籤
<!ELEMENT 元素名稱 類別> 或 <!ELEMENT元素名稱 (元素內容)>
類別:
空標籤:EMPTY 表示元素一定是空標籤
普通字符串:(#PCDATA)。表示元素的內容一定是普通字符串(不能含有子標籤)
任何內容:ANY。 表示元素的內容可以是任意內容
(元素內容):
順序問題:
<!ELEMENT 元素名稱(子元素名稱1,子元素名稱2,……)> :按順序出現子標籤
次數問題:
標籤:必須且只出現1次
標籤+:至少出現一次
標籤*:0或n次
標籤?:0或1次
約束屬性
<!ATTLIST 元素名稱 屬性名稱 屬性類型 默認值>
默認值:
#REQUIRED 屬性是必需的
#IMPLIED 屬性不是必需的
#FIXEDvalue 屬性不是必需的,但屬性值是固定的
屬性類型:控制屬性值
CDATA :表示普通的字符串
(en1|en2|…):表示一定是任選其中的一個值
ID: 表示在一個xml文檔中該屬性值必須唯一,值不能以數字開頭
10.3 XML Schema 也是一種用於定義和描述xml文檔結構與內容的模式語言,其出現是爲了克服DTD的侷限性
名稱空間:告訴xml文檔的哪個元素被哪個schema文檔約束。在一個xml文檔中,不同的標籤可以受到不同schema文檔約束
1、 一個名稱空間受到schema文檔約束的情況
2、 多個名稱空間受到多個schema文檔約束的情況
3、 默認名稱空間的情況
4、 沒有名稱空間的情況