XML 簡介 什麼是 xml? xml 是可擴展的標記性語言。 xml 的作用? xml 的主要作用有: 1、用來保存數據,而且這些數據具有自我描述性 2、它還可以做為項目或者模塊的配置文件 3、還可以做為網路傳輸數據的格式(現在 JSON 為主)。 xml 語法 文檔聲明。 元素(標簽) xml ...
目錄
XML 簡介
什麼是 xml?
xml 是可擴展的標記性語言。
xml 的作用?
xml 的主要作用有:
1、用來保存數據,而且這些數據具有自我描述性
2、它還可以做為項目或者模塊的配置文件
3、還可以做為網路傳輸數據的格式(現在 JSON 為主)。
xml 語法
- 文檔聲明。
- 元素(標簽)
- xml 屬性
- xml 註釋
- 文本區域(CDATA 區)
文檔聲明
我們先創建一個簡單 XML 文件,用來描述圖書信息
(1)創建一個 xml 文件
文件名:
<?xml version="1.0" encoding="UTF-8"?> xml 聲明。
<!-- xml 聲明 version 是版本的意思 encoding 是編碼 -->
而且這個<?xml
要連在一起寫,否則會有報錯
屬性
version | 是版本號 |
encoding | 是 xml 的文件編碼 |
standalone="yes/no" | 表示這個 xml 文件是否是獨立的 xml 文件 |
(2)圖書有 id 性 屬性 一 表示唯一 標識,書名,有作者,價格的信息
books.xml文件內容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- xml 聲明 version 是版本的意思 encoding 是編碼 -->
<books> <!-- 這是 xml 註釋 -->
<book id="SN9787302575443"> <!-- book 標簽描述一本圖書 id 屬性描述 的是圖書 的編號 -->
<name>Java 2實用教程(第6版)</name> <!-- name 標簽描述 的是圖書 的信息 -->
<author>耿祥義、張躍平</author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
<publisher>清華大學出版社</publisher> <!--publisher 單詞是出版社的意思,描述圖書的出版社-->
<price>65</price> <!-- price 單詞是價格,描述的是圖書 的價格 -->
</book>
<book id="SN9787020122172"> <!-- book 標簽描述一本圖書 id 屬性描述 的是圖書 的編號 -->
<name>駱駝祥子</name> <!-- name 標簽描述 的是圖書 的信息 -->
<author>老舍</author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
<publisher>人民文學出版社</publisher> <!--publisher 單詞是出版社的意思,描述圖書的出版社-->
<price>20.20</price><!-- price 單詞是價格,描述的是圖書 的價格 -->
</book>
</books>
在瀏覽器中可以查看到文檔:
xml 註釋
html 和 XML 註釋 一樣 :
<!-- html 註釋 -->
元素(標簽)
html 標簽:
格式 | <標簽名>封裝的數據</標簽名> |
單標簽 | <標簽名 /> <br /> 換行 <hr />水平線 |
雙標簽 | <標簽名>封裝的數據</標簽名> |
1. 標簽名大小寫不敏感
2. 標簽有屬性,有基本屬性和事件屬性
3. 標簽要閉合(不閉合 ,html 中不報錯。但我們要養成良好的書寫習慣。閉合)
1)什麼是 xml 元素
元素是指從開始標簽到結束標簽的內容。
例如:
<title>java2實用教程</title>
元素 我們可以簡單的理解為是 標簽。
Element 翻譯 元素
2)XML 命名規則
XML 元素必須遵循以下命名規則:
- 名稱可以含字母、數字以及其他的字元
例如:
<book id="SN9787302575443"> <!-- book 標簽描述一本圖書 id 屬性描述 的是圖書 的編號 -->
<name>Java 2實用教程(第6版)</name> <!-- name 標簽描述 的是圖書 的信息 -->
<author>耿祥義、張躍平</author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
<publisher>清華大學出版社</publisher> <!--publisher 單詞是出版社的意思,描述圖書的出版社-->
<price>65</price> <!-- price 單詞是價格,描述的是圖書 的價格 -->
- 名稱不能以數字或者標點符號開始
- 儘管以“xml”(或者 XML、Xml)是可以的、不報錯的,但是不建議名稱以字元 “xml”(或者 XML、Xml)開始
- 名稱不能包含空格
3)xml 也 中的元素(標簽)也 成 分成 單標簽和雙標簽:
單標簽
格式:
<標簽名 屬性=”值” 屬性=”值” ...... />
雙標簽
格式:
< 標簽名 屬性=”值” 屬性=”值” ......>文本數據或子標簽</標簽名>
xml 屬性
xml 的標簽屬性和 html 的標簽屬性是非常類似的, 屬性可以提供元素的額外信息
在標簽上可以書寫屬性:
一個標簽上可以書寫多個屬性。每個屬性的值必須使用 引號 引起來。
的規則和標簽的書寫規則一致。
API文檔截圖:
- 屬性必須使用引號引起來,不引起來會報錯
示例:
語法規則
- 所有 XML 元素都須有關閉標簽
-
XML 標簽對大小寫敏感
-
XML 必須正確地嵌套
-
XML 文檔必須有根元素
根元素就是頂級元素,
沒有父標簽的元素,叫頂級元素。
根元素是沒有父標簽的頂級元素,而且是唯一一個才行。
-
XML 的屬性值須加引號
-
XML 中的特殊字元
7. 文本區域(CDATA 區)
CDATA 語法可以告訴 xml 解析器,我 CDATA 里的文本內容,只是純文本,不需要 xml 語法解析
CDATA 格式:
<![CDATA[ 這裡可以把你輸入的字元原樣顯示,不會解析 xml ]]>
示例:
<book id="SN9787302575443"> <!-- book 標簽描述一本圖書 id 屬性描述 的是圖書 的編號 -->
<name>Java 2實用教程(第6版)</name> <!-- name 標簽描述 的是圖書 的信息 -->
<author><![CDATA[<<<耿祥義、張躍平>>>]]></author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
<publisher>清華大學出版社</publisher> <!--publisher 單詞是出版社的意思,描述圖書的出版社-->
<price>65</price> <!-- price 單詞是價格,描述的是圖書 的價格 -->
</book>
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 類庫的使用
Dom4j包下載:https://kohler.lanzouv.com/iv8R207qmvkh
解壓後:
dom4j 目錄的介紹
- docs 是文檔目錄
- 查 如何查 Dom4j 的文檔
- Dom4j 快速入門
- lib 目錄
5. src 目錄是第三方類庫的源碼目錄
dom4j 編程步驟
第一步: 先載入 xml 文件創建 Document 對象
第二步:通過 Document 對象拿到根元素對象
第三步:通過根元素.elelemts(標簽名); 可以返回一個集合,這個集合里放著。所有你指定的標簽名的元素對象
第四步:找到你想要修改、刪除的子元素,進行相應在的操作
第五步,保存到硬碟上
獲取 document 對象
創建一個 lib 目錄,並添加 dom4j 的 jar 包。並添加到類路徑。
需要解析的 books.xml 文件內容:
<?xml version="1.0" encoding="UTF-8"?>
<!-- xml 聲明 version 是版本的意思 encoding 是編碼 -->
<books> <!-- 這是 xml 註釋 -->
<book id="SN9787302575443"> <!-- book 標簽描述一本圖書 id 屬性描述 的是圖書 的編號 -->
<name>Java 2實用教程(第6版)</name> <!-- name 標簽描述 的是圖書 的信息 -->
<author><![CDATA[<<<耿祥義、張躍平>>>]]></author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
<publisher>清華大學出版社</publisher> <!--publisher 單詞是出版社的意思,描述圖書的出版社-->
<price>65</price> <!-- price 單詞是價格,描述的是圖書 的價格 -->
</book>
<book id="SN9787020122172"> <!-- book 標簽描述一本圖書 id 屬性描述 的是圖書 的編號 -->
<name>駱駝祥子</name> <!-- name 標簽描述 的是圖書 的信息 -->
<author>老舍</author> <!-- author 單詞是作者的意思 ,描述圖書作者 -->
<publisher>人民文學出版社</publisher> <!--publisher 單詞是出版社的意思,描述圖書的出版社-->
<price>20.20</price><!-- price 單詞是價格,描述的是圖書 的價格 -->
</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);
}
遍歷 、遍歷 簽 標簽 獲取所有標簽中的內容
/*
* 讀取 xml 文件中的內容(xml文件即上一步的books.xml)
*/
@Test
public void readXML() throws DocumentException {
// 需要分四步操作:
// 第一步,通過創建 SAXReader 對象。來讀取 xml 文件,獲取 Document 對象
// 第二步,通過 Document 對象。拿到 XML 的根元素對象
// 第三步,通過根元素對象。獲取所有的 book 標簽對象
// 第四小,遍歷每個 book 標簽對象。然後獲取到 book 標簽對象內的每一個元素,再通過 getText() 方法拿到起始標簽和結束標簽之間的文本內容
// 第一步,通過創建 SAXReader 對象。來讀取 xml 文件,獲取 Document 對象
SAXReader reader = new SAXReader();
//在Junit測試中,相對路徑是從模塊名開始算
Document document = reader.read("src/books.xml");
//第二步,通過 Document 對象。拿到 XML 的根元素對象
Element rootElement = document.getRootElement();
//System.out.println(rootElement);
//第三步,通過根元素對象。獲取所有的 book 標簽對象
//Element.elements(標簽名)它可以拿到當前元素下的指定的子元素的集合
//element()和elements()都是通過標簽名查找子元素
List <Element> books = rootElement.elements("book");
//第四步,遍歷每個 book 標簽對象。然後獲取到 book 標簽對象內的每一個元素,
for (Element book : books) {
// 拿到 book 下麵的 name 元素對象
Element nameElement = book.element("name");
// 拿到 book 下麵的 price 元素對象
Element priceElement = book.element("price");
// 拿到 book 下麵的 author 元素對象
Element authorElement = book.element("author");
// 拿到 book 下麵的 publisher 元素對象
Element publisherElement = book.element("publisher");
// 再通過 getText() 方法拿到起始標簽和結束標簽之間的文本內容
System.out.println("書名:" + nameElement.getText() + " , 價格:"
+ priceElement.getText() + "元, 作者:" + authorElement.getText() + ",出版社:" + publisherElement.getText());
}
}
}
列印內容:
如圖片失效等情況請參閱公眾號文章:https://mp.weixin.qq.com/s/T4tsUg4_YRiDRPEF7fhOtQ
歡迎關註公眾號:“愚生淺末”,一起學習交流。