一、XML基本知識
1.什麼是xml?
xml是 可擴展的標記性語言2.xml的三大作用!
1.數據存儲
2.作爲工程,或者模塊,框架的配置文件
3.數據共享,數據傳輸。數據交換格式。
比如說我們要用XML文件來描述圖書信息:
<?xml version="1.0" encoding="UTF-8"?>
<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 最主要是用來 數據描述、存儲數據 和 數據共享,以及數據傳輸(數據交換格式)。
3、xml語法
3.1、文檔聲明
我們先創建一個簡單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屬性 表示唯一 標識,書名,有作者,價格的信息
<?xml version="1.0" encoding="UTF-8"?>
<!--
<?xml version="1.0" encoding="UTF-8"?>
這是xml文件的聲明,表示這裏面的內容是xml文件
version屬性是表示版本的意思 1.0
encoding 表示xml文件的編碼
-->
<books><!-- books是xml文件的根元素 -->
<book id="SN1234132412"> <!-- book表示一個圖書的信息 id屬性爲圖書的唯一 編碼 -->
<name>葵花寶典</name><!-- name屬性表示書名 -->
<author>班長</author><!-- author屬性表示作者 -->
<price>9.9</price><!-- price屬性表示價格 -->
</book>
<book id="SN1234132412"> <!-- book表示一個圖書的信息 id屬性爲圖書的唯一 編碼 -->
在瀏覽器中可以查看到文檔
3.2、xml註釋
xml 和 HTML 註釋 一樣 : <!-- html 註釋 -->3.3、元素(標籤)
1)什麼是xml元素
元素是指從開始標籤到結束標籤的內容。
例如:<title>java編程思想</title>
元素 我們可以簡單的理解爲是 標籤。
Element 翻譯 元素
2)XML 命名規則
XML 元素必須遵循以下命名規則:
2.1)含字母、數字以及其他的字符
例如:
<book id="SN213412341"> <!-- 描述一本書 -->
<author>班導</author> <!-- 描述書的作者信息 -->
<name>java編程思想</name> <!-- 書名 -->
<price>9.9</price> <!-- 價格 -->
</book>
2.2)名稱不能以數字或者標點符號開始
2.3)名稱不能以字符 “xml”(或者 XML、Xml)開始 (它是可以的)
2.4)名稱不能包含空格
3)xml中的元素(標籤)也 分成 單標籤和雙標籤:
單標籤
格式: <標籤名 屬性=”值” 屬性=”值” ...... />
雙標籤
格式:< 標籤名 屬性=”值” 屬性=”值” ......>文本數據或子標籤</標籤名>
3.4、xml屬性
xml的標籤屬性和html 的標籤屬性是非常類似的,屬性可以提供元素的額外信息在標籤上可以書寫屬性:
一個標籤上可以書寫多個屬性。每個屬性的值可以使用 引號 引起來。
規則和標籤的書寫規則一致。
3.5、語法規則:
所有 XML 元素都須有關閉標籤(也就是閉合)XML 標籤對大小寫敏感
XML 必須正確地嵌套
XML 文檔必須有根元素
XML 的屬性值須加引號
xml 中的特殊字符(<,>必須使用特殊字符來代替)<,>
3.6、文本區域(CDATA區)
CDATA 格式:<![CDATA[這裏可以把你輸入的字符原樣顯示,不會解析xml]]>
二、xml解析技術介紹
不管是html文件還是xml文件它們都是標記型文檔,都可以使用w3c組織制定的dom技術來解析。
document對象表示的是整個文檔(可以是html文檔,也可以是xml文檔)
早期JDK爲我們提供了兩種xml解析技術Dom和Sax簡介(已經過時,但我們需要知道這麼個東西)
dom解析技術是W3C組織制定的,而所有的編程語言都對這個解析技術使用了自己語言的特點進行實現。
Java對dom技術解析標記也做了實現。
早期sun公司就制定的 dom 技術。它需要把整個xml文件一下子加載到內存對象中。然後創建大量的dom內存對象,然後通過getElementById、getElementsByName 、getElementsByTagName 等方法一層一層遍歷解析。
dom解析:性能和內存消耗都非常差
sun公司在JDK5版本對 dom解析技術進行升級:SAX( Simple API for XML )
SAX解析,它跟W3C制定的dom解析不太一樣。它是以類似事件機制通過回調告訴用戶當前正在解析的內容。
它是一行一行的讀取xml文件進行解析的。不會創建大量的dom對象。
所以它在解析xml的時候,在內存的使用上。和性能上。都優於Dom解析。
第三方的解析:
jdom 在dom基礎上進行了封裝 、
dom4j 又對jdom 進行了封裝。
pull 主要用在Android 手機開發,是在跟sax非常類似都是事件機制解析xml文件。
這個Dom4j 它是第三方的解析技術。我們需要使用第三方給我們提供好的類庫纔可以解析xml文件。
三、dom4j解析技術(重點*****)
由於dom4j 它不是sun公司的技術,而屬於第三方公司的技術,我們需要使用dom4j 就需要到dom4j官網下載dom4j的jar包。1.Dom4j 類庫的使用
1)、把 dom4j-1.6.1.jar 類包,拷貝到工程 lib 目錄下
2)、然後把jar包添加到當前的classpath路徑中
dom4j 編程步驟:
1.先讀取xml文件,生成document對象
2.通過Document對象獲取到根標籤對象
3.通過根標籤對象.elements(標籤名); 獲取到所有的指定標籤名的孩子節點集合
4.然後一層一層遍歷到你要操作的元素節點進行操作。比如
a)getText() 可以獲取標籤中的文本
b)setText() 就可以修改標籤中的文本內容
5.將修改後的document保存到硬盤中。
1.1、獲取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
/**
* 解析xml第一步,讀取xml文件生成document對象
* @throws DocumentException
*/
@Test
public void getDocument() throws DocumentException {
// 先創建一個SAXread對象讀取xml文件生成document對象
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
System.out.println(document);
}
1.2、遍歷 標籤 獲取所有標籤中的內容(*****重點)
需要分四步操作:第一步,先讀取xml文件生成document對象
第二步,通過document對象獲取根元素對象
第三步,通過根元素對象.elements(標籤名) 得到指定標籤名的孩子元素集合
第四步,一層一層遍歷獲取到你想要操作的孩子節點。然後調用對象.getText()獲取文本內容
/**
* 獲取xml文件中所有文本內容
* @throws DocumentException
*/
@Test
public void readXML() throws DocumentException {
// 第一步,先讀取xml文件生成document對象
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
// 第二步,通過document對象獲取根元素對象
Element rootElement = document.getRootElement();
// .asXML()方法把當前元素對象。轉換成爲xml的字符串
// System.out.println(rootElement.asXML());
// 第三步,通過根元素對象.elements(標籤名) 得到指定標籤名的孩子元素集合
List<Element> bookList = rootElement.elements("book");
// System.out.println(bookList.size());
for (Element book : bookList) {
// 第四步,一層一層遍歷獲取到你想要操作的孩子節點。然後調用對象.getText()獲取文本內容
// 獲取 當前元素中屬性的值
String snValue = book.attributeValue("sn");
// System.out.println(snValue);
// 通過book標籤對象.element(標籤名) 獲取指定標籤名的孩子元素
Element nameElement = book.element("name");
// .getText()獲取 元素中的文本內容
String nameText = nameElement.getText();
// System.out.println(nameText);
// System.out.println(nameElement.asXML());
// elementText(標籤名)可以直接獲取指定標籤名的孩子元素的文本內容
String priceText = book.elementText("price");
// System.out.println(priceText);
// 獲取author元素的文本內容
String authorText = book.elementText("author");
// 把獲取 的xml的文本內容轉換成爲bean對象
Book bookBean = new Book(snValue, nameText, Double.valueOf(priceText), authorText);
System.out.println(bookBean);
// System.out.println("圖書編碼:" + snValue + ", 書名="
// + nameText + ",作者:" + authorText + ",價格:" + priceText);
}
}
打印內容 :
1.3、增加元素和屬性
需求:給班長添加一個<girl boyfriend=”班長”>鳳姐</girl>元素。/**
* 第二本圖書的後面添加<girl boyfriend=”班長”>鳳姐</girl>元素
*
* @throws DocumentException
* @throws IOException
*/
@Test
public void addXML() throws DocumentException, IOException {
// 第一步,先讀取xml文件生成document對象
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
// 第二步,通過document.getRootElement()獲取到根元素對象
Element rootElement = document.getRootElement();
// 第三步,通過根元素對象.elements("book").get(1)獲取到第二個book元素對象
Element secondBook = (Element) rootElement.elements("book").get(1);
// System.out.println(secondBook.asXML());
// 第四步,通過book元素對象.addElement(標籤名); 創建標籤對象
Element girlElement = secondBook.addElement("girl"); // 在第二個book中添加<girl></girl>
// 第五步,給新創建的girl標籤設置文本內容和添加屬性
girlElement.setText("鳳姐");
girlElement.addAttribute("boyfriend", "班長");
// System.out.println(document.asXML());
// 第六步,保存修改好的xml內容到硬盤文件中
// 第一種將document保存到硬盤文件的方法
// FileWriter out = new FileWriter("foo.xml");
// document.write(out);
// out.close();
// 第二種輸出的方法。使用dom4j提交好的xmlWriter來實現輸出
// XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
// writer.write(document);
// writer.close();
// 第三種將document保存到硬盤的方法
//它會先將xml文件格式化後輸出到硬盤中
// OutputFormat prettyFormat = OutputFormat.createPrettyPrint();
// XMLWriter writer2 = new XMLWriter(new FileWriter("output2.xml"), prettyFormat);
// writer2.write(document);
// writer2.close();
// 第四種將document保存到硬盤的方法
// 它會將xml文件中無用的空格和換行去掉
// 第四種方法常用於格式後進行網絡的輸出
OutputFormat compactFormat = OutputFormat.createCompactFormat();
XMLWriter writer3 = new XMLWriter(new FileWriter("output3.xml"), compactFormat);
writer3.write(document);
writer3.close();
}
2、XPath快速搜索技術
XPath其他是一種表達式快速搜索的技術。
XPath 練習:
需求1. 獲取books下的所有book標籤 /books/book
需求2. 獲取根標籤下的books元素下的book元素,且這個book元素擁有sn屬性,且值爲SN12341231。下的name元素
需求3. 獲取根標籤下的books元素下的第一個book元素 /books/book[1]
@Test
public void xPathTest() throws DocumentException {
// XPath 練習:
// 需求1. 獲取books下的所有book標籤
// 需求2. 獲取根標籤下的books元素下的book元素,且這個book元素擁有abc屬性,且值爲true。下的name元素
// 需求3. 獲取根標籤下的books元素下的第一個book元素
Document document = Dom4jUtils.getDocument("src/books.xml");
// 需求1. 獲取books下的所有book標籤
// /books/book
List<Node> nodes = document.selectNodes("/books/book");
System.out.println(nodes.size());
// 需求3. 獲取根標籤下的books元素下的第一個book元素
// /books/book[1] //這個xPath的的下標從1開始
Node bookNode = document.selectSingleNode("/books/book[1]");
System.out.println(bookNode.asXML());
// 需求2. 獲取根標籤下的books元素下的book元素,且這個book元素擁有abc屬性,且值爲true。下的name元素
// /books/book[@abc='true']/name
Node nameNode = document.selectSingleNode("/books/book[@abc='true']/name");
System.out.println(nameNode.asXML());
}
XPath 第三方類庫的依賴lib 包,沒有找到,報錯。找需要的類庫,導入項目