寫在前面: 這篇文章介紹XML的語法以及使用,還有使用java解析xml。
希望能夠對大家有所幫助,點贊支持是我最大的動力!
作者公衆號:小白編碼
本文目錄
XML是什麼?
- XML 指可擴展標記語言(EXtensible Markup Language)
- XML 是一種標記語言,很類似 HTML
- XML 的設計宗旨是傳輸數據,而非顯示數據
- XML 標籤沒有被預定義。您需要自行定義標籤。
- XML 被設計爲具有自我描述性。
- XML 是 W3C 的推薦標準
XML 與 HTML 的主要差異
XML 不是 HTML 的替代。
XML 和 HTML 爲不同的目的而設計:
XML 被設計爲傳輸和存儲數據,其焦點是數據的內容。
HTML 被設計用來顯示數據,其焦點是數據的外觀。
HTML 旨在顯示信息,而 XML 旨在傳輸信息。
html 標籤:
格式:<標籤名>封裝的數據</標籤名>
單標籤: <標籤名/> <br /> 換行<hr />水平線
雙標籤<標籤名>封裝的數據</標籤名>
標籤名大小寫不敏感
標籤有屬性,有基本屬性和事件屬性
標籤要閉合(不閉合,html 中不報錯。但我們要養成良好的書寫習慣。閉合)
xml 的主要作用有:
1、用來保存數據,而且這些數據具有自我描述性
2、它還可以做爲項目或者模塊的配置文件
3、還可以做爲網絡傳輸數據的格式(現在JSON 爲主)。
xml 語法
- 文檔聲明。
- 元素(標籤)
- xml 屬性
- xml 註釋
- 文本區域(CDATA 區)
屬性:
version 是版本號
encoding 是xml 的文件編碼
standalone=“yes/no” 表示這個xml 文件是否是獨立的xml 文件
xml格式:
<?xml version="1.0" encoding="UTF-8"?>
<!--這個<?xml 要連在一起寫,否則會有報錯-->
<!-- xml 聲明version 是版本的意思encoding 是編碼-->
<books> <!-- 這是xml 註釋-->
<book id="SN123123413241">
<!-- book 標籤描述一本圖書id 屬性描述的是圖書的編號-->
<name>java從入門到放棄</name>
<!-- name 標籤描述的是圖書的信息-->
<author>codwhite</author>
<!-- author 單詞是作者的意思,描述圖書作者-->
<price>999</price>
<!-- price 單詞是價格,描述的是圖書的價格-->
</book>
</books>
XML語法規則:
- XML 開頭聲明
<?xml version="1.0" encoding="UTF-8" ?>
<!-- xml 聲明version 是版本的意思encoding 是編碼-->
- XML 文檔必須有根元素
<!--必須有一個根元素,可以根據自身要求定義-->
<root>
<book>
<name>java從入門到放棄</name>
</book>
</root>
- 所有的 XML 元素都必須有一個關閉標籤
<name>java從入門到放棄</name>
<!--</name>就是一個關閉標籤-->
錯誤寫法:
<name>java從入門到放棄
- XML 標籤對大小寫敏感
<Name>java從入門到放棄</name>
<!--不能這樣聲明,否則報錯-->
正確寫法:
<name>java從入門到放棄</name>
- XML 必須正確嵌套
正確的嵌套:
<book>
<name>java從入門到放棄</name>
</book>
錯誤的嵌套:
<name>
<book>java從入門到放棄</name>
</book>
- XML 屬性值必須加引號
xml 的標籤屬性和html 的標籤屬性是非常類似的,屬性可以提供元素的額外信息在標籤上可以書寫屬性:一個標籤上可以書寫多個屬性。每個屬性的值必須使用引號引起來。
正確屬性值寫法:
<book id="SN123123413241">
<name>java從入門到放棄</name>
</book>
錯誤屬性值寫法:
<book id=SN123123413241>
<name>java從入門到放棄</name>
</book>
- XML 中的註釋
<!--這個就是XML註釋-->
- 實體引用
在 XML 中,一些字符擁有特殊的意義。
如果您把字符 “<” 放在 XML 元素中,會發生錯誤,這是因爲解析器會把它當作新元素的開始。
這樣會產生 XML 錯誤:
錯誤寫法:
<message>if salary < 1000 then</message>
用實體引用來避免錯誤:(<代表<)
<message>if salary < 1000 then</message>
在 XML 中,有 5 個預定義的實體引用:
< | < | less than |
---|---|---|
> | > | greater than |
& | & | ampersand |
' | ’ | apostrophe |
" | " | quotation mark |
- XML標籤名稱不能以數字或者標點符號開始
錯誤寫法:
<1book id="SN123123413241"/>
- 名稱不得包含空格
<b ook id="SN123123413241"/>
- XML中的單標籤與雙標籤
單標籤
格式: <標籤名屬性=”值” 屬性=”值” ...... />
<book id="SN123123413241"/>
雙標籤
<book id=SN123123413241></book>
格式:< 標籤名屬性=”值” 屬性=”值” ......>文本數據或子標籤</標籤名>
文本區域(CDATA 區)
CDATA 語法可以告訴xml 解析器,我CDATA 裏的文本內容,只是純文本,不需要xml 語法解析
CDATA 格式:
<![CDATA[ 這裏可以把你輸入的字符原樣顯示,不會解析xml ]]>
Dom4j 解析技術
dom4j 編程步驟:
首先需要dom4j庫:
第一步: 先加載xml 文件創建Document 對象
第二步: 通過Document 對象拿到根元素對象
第三步: 通過根元素.elelemts(標籤名); 可以返回一個集合,這個集合裏放着。所有你指定的標籤名的元素對象
第四步: 找到你想要修改、刪除的子元素,進行相應在的操作
第五步: 保存到硬盤上
①需要解析的books.xml 文件內容
<?xml version="1.0" encoding="UTF-8"?>
<books>
<book sn="SN12341232">
<name>JAVA從入門到放棄</name>
<price>9.9</price>
<author>小白</author>
</book>
<book sn="SN12341231">
<name>Mysql從刪庫到跑路</name>
<price>99.99</price>
<author>codewhite</author>
</book>
</books>
②創建javabean(books)
//get,set,構造器,tostring自行添加
public class Book {
private String sn;
private String name;
private Double price;
private String author;
}
③解析獲取Document 對象的代碼
第一步,先創建SaxReader
對象。這個對象,用於讀取xml 文件,並創建Document
/*
* dom4j 獲取Documet 對象
*/
@Test
public void testGetDocument() 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 的根元素對象Element
第三步,通過根元素對象
。獲取所有的book 標籤對象
第四步,遍歷每個book 標籤
對象。然後獲取到book 標籤對象內的每一個元素,再通過getText() 方法拿到起始標籤和結束標籤之間的文本內容
/*
* 讀取xml 文件中的內容
*/
@Test
public void readXML() throws DocumentException {
// 第一步,通過創建SAXReader 對象。來讀取xml 文件,獲取Document 對象
SAXReader reader = new SAXReader();
Document document = reader.read("src/books.xml");
// 第二步,通過Document 對象。拿到XML 的根元素對象
Element root = document.getRootElement();
// 第三步,通過根元素對象。獲取所有的book 標籤對象
// Element.elements(標籤名)它可以拿到當前元素下的指定的子元素的集合
List<Element> books = root.elements("book");
// 第四步,遍歷每個book 標籤對象。然後獲取到book 標籤對象內的每一個元素,
for (Element book : books) {
// 打印測試
// Element.asXML() 它將當前所有元素轉換成爲String 對象
// System.out.println( root.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());
}
}
結果演示:
案例2:
@Test
public void test2() throws Exception {
//讀取books.xml文件
SAXReader saxReader = new SAXReader();
//2.通過Document對象獲得根元素
Document document = saxReader.read("src/books.xml");
Element rootElement = document.getRootElement();
System.out.println(rootElement);
//3.通過根元素獲取book標籤對象
//element和lement都是通過標籤名查找子元素
List<Element> books = rootElement.elements("book");
for (Element book : books) {
// Element.asXML() 它將當前所有元素轉換成爲String 對象
// System.out.println( root.asXML() );
// Element.element(標籤名)拿到當前元素下子元素
Element elementName = book.element("name");
//getText 可以將獲取標籤中的文本內容
String nameText = elementName.getText();
System.out.println(nameText);
//或者用elementTest("標籤名")直接獲取標籤名的文本內容
String priceText = book.elementText("price");
String authorText = book.elementText("author");
String snValue = book.attributeValue("sn");
System.out.println(new Book(snValue, nameText, Double.parseDouble(priceText), authorText));
}
}
結果演示:
寫在後邊:
本文學習資料來源於:百度百科,菜鳥教程,尚硅谷教程等。
如果有問題可以聯繫我。