第二十三章:XML可擴充套件標記語言
作者:java_wxid
XML 簡介
什麼是 XML?
XML 指可擴充套件標記語言(EXtensible Markup Language)。
XML 是一種很像HTML的標記語言。
XML 的設計宗旨是傳輸資料,而不是顯示資料。
XML 標籤沒有被預定義。您需要自行定義標籤。
XML 被設計為具有自我描述性。
XML 和 HTML 之間的差異
XML 被設計用來傳輸和儲存資料,其焦點是資料的內容。 XML 不會做任何事情
HTML 被設計用來顯示資料,其焦點是資料的外觀。
HTML 旨在顯示資訊,而 XML 旨在傳輸資訊。
xml的作用?
3個作用:
1、可以用來儲存資料。
2、它可以用來做為工程或模組的配置檔案。
3、它可以用來做為網路資料傳輸的格式。
xml語法
1.文件宣告。
2.元素(標籤)
3.xml屬性
4.xml註釋
5.文字區域(CDATA區)
1.文件宣告。
建立一個xml檔案
<!-- xml宣告 version是版本的意思 encoding是編碼 -->
而且這個<?xml 要連在一起寫,否則會有報錯
屬性
version 是版本號
encoding 是xml的檔案編碼
standalone=“yes/no” 表示這個xml檔案是否是獨立的xml檔案
圖書有id屬性 表示唯一 標識,書名,有作者,價格的資訊
<?xml version="1.0" encoding="UTF-8"?> <!-- xml宣告 version是版本的意思 encoding是編碼 --> <books> <!-- 這是xml註釋 --> <book id="SN123123413241"> <!-- book標籤描述一本圖書 id屬性描述 的是圖書 的編號 --> <name>java程式設計思想</name> <!-- name標籤描述 的是圖書 的資訊 --> <author>華仔</author> <!-- author單詞是作者的意思 ,描述圖書作者 --> <price>9.9</price> <!-- price單詞是價格,描述的是圖書 的價格 --> </book> <book id="SN12341235123"> <!-- book標籤描述一本圖書 id屬性描述 的是圖書 的編號 --> <name>葵花寶典</name> <!-- name標籤描述 的是圖書 的資訊 --> <author>班長</author> <!-- author單詞是作者的意思 ,描述圖書作者 --> <price>5.5</price> <!-- price單詞是價格,描述的是圖書 的價格 --> </book> </books>
xml註釋
html 和 XML 註釋 一樣 : <!-- html 註釋 -->
元素(標籤)
什麼是xml元素?
元素是指從開始標籤到結束標籤的內容。
例如:<title>java程式設計思想
元素 我們可以簡單的理解為是 標籤。
Element 翻譯 元素
XML 命名規則
XML 元素必須遵循以下命名規則:
2.1)名稱可以含字母、數字以及其他的字元
例如:
<book id="SN213412341"> <!-- 描述一本書 -->
<author>班導</author> <!-- 描述書的作者資訊 -->
<name>java程式設計思想</name> <!-- 書名 -->
<price>9.9</price> <!-- 價格 -->
</book>
名稱不能以數字或者標點符號開始
名稱不能包含空格
xml中的元素(標籤)也 分成 單標籤和雙標籤:
單標籤
格式: <標籤名 屬性=”值” 屬性=”值” … />
雙標籤
格式:< 標籤名 屬性=”值” 屬性=”值” …>文字資料或子標籤</標籤名>
語法規則:
所有 XML 元素都須有關閉標籤(也就是閉合)
XML 標籤對大小寫敏感
XML 必須正確地巢狀
XML 文件必須有根元素
XML 的屬性值須加引號
XML中的特殊字元
文字區域(CDATA區)
CDATA 格式:
<![CDATA[ 這裡可以把你輸入的字元原樣顯示,不會解析xml ]]>
xml解析技術介紹
xml可擴充套件的標記語言。
不管是html檔案還是xml檔案它們都是標記型文件,都可以使用w3c組織制定的dom技術來解析。
document物件表示的是整個文件(可以是html文件,也可以是xml文件)
早期JDK為我們提供了兩種xml解析技術Dom和Sax簡介(已經過時,但我們需要知道這麼個東西)
dom解析技術是W3C組織制定的,而所有的程式語言都對這個解析技術使用了自己語言的特點進行實現。
Java對dom技術解析標記也做了實現。
sun公司在JDK5版本對 dom解析技術進行升級:SAX( Simple API for XML )
SAX解析,它跟W3C制定的解析不太一樣。它是以類似事件機制通過回撥告訴使用者當前正在解析的內容。
它是一行一行的讀取xml檔案進行解析的。不會建立大量的dom物件。
所以它在解析xml的時候,在記憶體的使用上。和效能上。都優於Dom解析。
第三方的解析:
jdom 在dom基礎上進行了封裝 、
dom4j 又對jdom 進行了封裝。
pull 主要用在Android 手機開發,是在跟sax非常類似都是事件機制解析xml檔案。
這個Dom4j 它是第三方的解析技術。我們需要使用第三方給我們提供好的類庫才可以解析xml檔案。
dom4j解析技術
由於dom4j 它不是sun公司的技術,而屬於第三方公司的技術,我們需要使用dom4j 就需要到dom4j官網下載dom4j的jar包。
Dom4j 類庫的使用
把 dom4j-1.6.1.jar 類包,拷貝到工程 lib 目錄下
然後把jar包新增到當前的classpath路徑中
類庫新增成功的示意圖:
dom4j 目錄的介紹:
docs 是 文 檔 目 錄
如何查Dom4j 的文件
Dom4j 快速入門
lib 目錄
src 目錄是第三方類庫的原始碼目錄:
dom4j 程式設計步驟:
第一步: 先載入xml檔案建立Document物件
第二步:通過Document物件拿到根元素物件
第三步:通過根元素.elelemts(標籤名); 可以返回一個集合,這個集合裡放著。所有你指定的標籤名的元素物件
第四步:找到你想要修改、刪除的子元素,進行相應在的操作
第五步,儲存到硬碟上
獲取document物件
需要解析的books.xml檔案內容
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book sn="SN12341232">
<name>辟邪劍譜</name>
<price>9.9</price>
<author>班主任</author>
</book>
<book sn="SN12341231">
<name>葵花寶典</name>
<price>99.99</price>
<author>班長</author>
</book>
</books>
解析獲取Document物件的程式碼
第一步,先建立SaxReader物件。這個物件,用於讀取xml檔案,並建立Document
dom4j 獲取Documet物件
@Test
public void getDocument() throws DocumentException {
// 要建立一個Document物件,需要我們先建立一個SAXReader物件
SAXReader reader = new SAXReader();
// 這個物件用於讀取xml檔案,然後返回一個Document。
Document document = reader.read("src/books.xml");
// 列印到控制檯,看看是否建立成功
System.out.println(document);
}
遍歷 標籤 獲取所有標籤中的內容(*****重點)
需要分四步操作:
第一步,通過建立SAXReader物件。來讀取xml檔案,獲取Document物件
第二步,通過Document物件。拿到XML的根元素物件
第三步,通過根元素物件。獲取所有的book 標籤物件
第四小,遍歷每個book標籤物件。然後獲取到book標籤物件內的每一個元素,再通過getText() 方法拿到起始標籤和結束標籤之間的文字內容
/*
* 讀取xml檔案中的內容
*/
@Test
public void readXML() throws DocumentException {
// 需要分四步操作:
// 第一步,通過建立SAXReader物件。來讀取xml檔案,獲取Document物件
// 第二步,通過Document物件。拿到XML的根元素物件
// 第三步,通過根元素物件。獲取所有的book 標籤物件
// 第四小,遍歷每個book標籤物件。然後獲取到book標籤物件內的每一個元素,再通過getText() 方法拿到起始標籤和結束標籤之間的文字內容
// 第一步,通過建立SAXReader物件。來讀取xml檔案,獲取Document物件
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
// 第二步,通過Document物件。拿到XML的根元素物件
Element root = document.getRootElement();
// 列印測試
// Element.asXML() 它將當前元素轉換成為String物件
// System.out.println( root.asXML() );
// 第三步,通過根元素物件。獲取所有的book 標籤物件
// Element.elements(標籤名)它可以拿到當前元素下的指定的子元素的集合
List<Element> books = root.elements("book");
// 第四小,遍歷每個book標籤物件。然後獲取到book標籤物件內的每一個元素,
for (Element book : books) {
// 測試
// System.out.println(book.asXML());
// 拿到book下面的name元素物件
Element nameElement = book.element("name");
// 拿到book下面的price元素物件
Element priceElement = book.element("price");
// 拿到book下面的author元素物件
Element authorElement = book.element("author");
// 再通過getText() 方法拿到起始標籤和結束標籤之間的文字內容
System.out.println("書名" + nameElement.getText() + " , 價格:"
+ priceElement.getText() + ", 作者:" + authorElement.getText());
}
}
列印內容:
常見錯誤:
檔案找不到異常