1 課程回顧
XML基礎
1)XML的作用
1.1 作爲軟件配置文件
1.2 作爲小型的“數據庫”
2)XML語法(由w3c組織規定的)
標籤:
標籤名不能以數字開頭,中間不能有空格,區分大小寫。有且僅有一個根標籤。
屬性:
可有多個屬性,但屬性值必須用引號(單引號或雙引號)包含,但不能省略,也不能單 雙混用。
文檔聲明:
<?xml version="1.0"encoding="utf-8"?>
encoding="utf-8": 打開或解析xml文檔時的編碼
注意:
保存xml文檔時的編碼 和 解析xml文檔時的編碼要保持一致,才能避免中文亂碼問題!
3)XML解析
程序讀取或操作xml文檔
兩種解析方式: DOM解析 vs SAX解析
DOM解析原理:一次性把xml文檔加載成Document樹,通過Document對象得到節點對象,通過節點對象訪問xml文檔內容(標籤,屬性,文本,註釋)。
Dom4j工具(基於DOM解析原理):
讀取xml文檔:
Document doc = newSAXReader().read("xml文件");
節點:
nodeIterator(); 所有節點
標籤:
element("名稱") 指定名稱的第一個子標籤對象
elementIterator("名稱"); 指定名稱的所有子標籤對象
elements(); 所有子標籤對象
屬性:
attributeValue(“名稱”)指定名稱的屬性值
attribute("名稱") 指定名稱的屬性對象
getName() 屬性名稱
getValue() 屬性值
atributeIterator() 所有屬性對象(Iterator)
attributes() 所有屬性對象(List)
文本:
getText() 得到當前標籤的文本
elementText("子標籤名稱") 得到子標籤的文本
今天的目標: Dom4J修改xml + xPath技術 + SAX解析 + XML約束
2 Dom4j修改xml文檔
2.1 寫出內容到xml文檔
XMLWriter writer = newXMLWriter(OutputStream, OutputForamt)
wirter.write(Document);
2.2 修改xml文檔的API
增加:
DocumentHelper.createDocument() 增加文檔
addElement("名稱") 增加標籤
addAttribute("名稱",“值”) 增加屬性
修改:
Attribute.setValue("值") 修改屬性值
Element.addAtribute("同名的屬性名","值") 修改同名的屬性值
Element.setText("內容") 修改文本內容
刪除
Element.detach(); 刪除標籤
Attribute.detach(); 刪除屬性
3 xPath技術
3.1引入
問題:當使用dom4j查詢比較深的層次結構的節點(標籤,屬性,文本),比較麻煩!!!
3.2xPath作用
主要是用於快速獲取所需的節點對象。
3.3在dom4j中如何使用xPath技術
1)導入xPath支持jar包。 jaxen-1.1-beta-6.jar
2)使用xpath方法
List<Node> selectNodes("xpath表達式"); 查詢多個節點對象
Node selectSingleNode("xpath表達式"); 查詢一個節點對象
3.4xPath語法
/ 絕對路徑 表示從xml的根位置開始或子元素(一個層次結構)
// 相對路徑 表示不分任何層次結構的選擇元素。
* 通配符 表示匹配所有元素
[] 條件 表示選擇什麼條件下的元素
@ 屬性 表示選擇屬性節點
and 關係 表示條件的與關係(等價於&&)
text() 文本 表示選擇文本內容
3.5 案例
用戶登錄功能:
用戶輸入用戶名和密碼 -> 到“數據庫”查詢是否有對應的用戶->
有: 則表示登錄成功
沒有: 則表示登錄失敗
用xml當做數據庫
user.xml 用來存儲用戶的數據
4 SAX解析
4.1回顧DOM解析
DOM解析原理:一次性把xml文檔加載進內存,然後在內存中構建Document樹。
對內存要求比較要。
缺點: 不適合讀取大容量的xml文件,容易導致內存溢出。
SAX解析原理: 加載一點,讀取一點,處理一點。對內存要求比較低。
4.2SAX解析工具
SAX解析工具- Sun公司提供的。內置在jdk中。org.xml.sax.*
核心的API:
SAXParser類: 用於讀取和解析xml文件對象
parse(File f,
DefaultHandler dh
)方法:解析xml文件
參數一: File:表示 讀取的xml文件。
參數二: DefaultHandler: SAX事件處理程序。使用DefaultHandler的子類
例如:{
1.創建SAXParser對象
SAXParser parser=SAXParserFactory.newInstance().newSAXParser();
2.調用parse方法
parser.parse(new File("./src/contact.xml"), new MyDefaultHandler());
} [一個類繼承class 類名(extends DefaultHandler) 在調用是創建傳進去
DefaultHandler類的API:
void startDocument() : 在讀到文檔開始時調用
void endDocument() :在讀到文檔結束時調用
voidstartElement(String uri, String localName, String qName, Attributes attributes) :讀到開始標籤時調用
voidendElement(String uri, String localName, String qName) :讀到結束標籤時調用
voidcharacters(char[] ch, int start, int length) :讀到文本內容時調用
============DOM解析 vs SAX解析 ========
DOM解析 |
SAX解析 |
原理: 一次性加載xml文檔,不適合大容量的文件讀取 |
原理: 加載一點,讀取一點,處理一點。適合大容量文件的讀取 |
DOM解析可以任意進行增刪改成 |
SAX解析只能讀取 |
DOM解析任意讀取任何位置的數據,甚至往回讀 |
SAX解析只能從上往下,按順序讀取,不能往回讀 |
DOM解析面向對象的編程方法(Node,Element,Attribute),Java開發者編碼比較簡單。 |
SAX解析基於事件的編程方法。java開發編碼相對複雜。 |
總結:
1)Dom4j修改xml文檔
new XMLWrier();
......
2)xPath技術: 快速查詢xml節點
selectNodes()
selectSinglNode();
xpath表達式語言
3) SAX解析
SAXParser parse
parser()
DefaultHandler類:
startElement();
characters();
endElement();
作業:
設計一個通訊錄程序
聯繫人: 編號 姓名 性別 年齡 電話 QQ 郵箱
功能要求:
添加聯繫人
修改聯繫人
刪除聯繫人
查詢所有聯繫人
要求:
1)交互使用console(控制檯)
2)數據存儲到xml文件(作爲“數據庫”)(使用dom4j)
提示:
啓動程序
================
【1】添加聯繫人
【2】修改聯繫人
【3】刪除聯繫人
【4】查詢所有聯繫人
【Q】退出程序
==================
輸入 1:
請輸入編號:
請輸入姓名:
請輸入年齡
。。。。
添加成功! -> 數據保存在xml中
輸入2
。。。。。。
輸入4
編號 姓名 年齡 。。。。
001 張三 30
002 李四 20 。。。
。。。。。