XML的簡介
- XML 指可擴展標記語言(EXtensible Markup Language)
- XML 是一種標記語言,很類似 HTML
- XML 的設計宗旨是傳輸數據,而非顯示數據
- XML 標籤沒有被預定義。您需要自行定義標籤。
- XML 被設計爲具有自我描述性。
- XML 是 W3C 的推薦標準
- XML 允許創作者定義自己的標籤和自己的文檔結構。
- XML 是各種應用程序之間進行數據傳輸的最常用的工具,並且在信息存儲和描述領域變得越來越流行。
XML文件的創建
1.直接創建file,取名爲xxx.xml
2.配置模板,這樣以後創建起來就很方便了。
XML語法
1.所有 XML 元素都須有關閉標籤。
//錯誤演示
<p>This is a paragraph
//正確寫法
<p>This is another paragraph</p>
2.XML 標籤對大小寫敏感。
<Message>這是錯誤的。</message>
<message>這是正確的。</message>
3.XML 必須正確地嵌套。
<b><i>錯誤嵌套</b></i>
<b><i>正確嵌套</i></b>
4.XML 文檔必須有一個根元素。
<root>
<child>
...
</child>
</root>
5.XML 的屬性值須加引號。
<student name="zhangsan"></student>
6.在 XML 中,空格會被保留。
<student>a b</student>
//輸出:a b
7.XML 中的註釋。
<!-- 我是一個註解 -->
8.實體引用(轉義字符)。
//解析會出現錯誤
<student>a>b</student>
//正確寫法
<student>a>b</student>
XML元素
XML 元素指的是從(且包括)開始標籤直到(且包括)結束標籤的部分,元素可包含其他元素、文本或者兩者的混合物。元素也可以擁有屬性。
XML 元素必須遵循以下命名規則:
- 名稱可以含字母、數字以及其他的字符。
- 名稱不能以數字或者標點符號開始。
- 名稱不能以字符 “xml”(或者 XML、Xml)開始。
- 名稱不能包含空格。
屬性的定義以及注意事項:
- 屬性必須定義在標籤體的開始標籤體內。
- 以鍵值對的方式定義,值必須用引號引起來( 屬性名=“屬性值”)。
- 一個標籤中可以有多個屬性,但是不能有同名的屬性。
- 屬性名不能使用空格、冒號等特殊字符,且必須以字母開頭。
xml標籤的兩種寫法:
//普通閉合標籤 可以有子元素且可以有屬性和文本
<birthday></birthday>
//自閉合標籤 不能有子元素且只能有屬性
<birthday/>
dtd約束
定義dtd約束:
<!-- xml中有一個根標籤books
標籤books中有兩個子標籤book
*代表的多個-->
<!ELEMENT books (book*) >
<!-- book中有多個標籤 *代表可以寫多個 -->
<!ELEMENT book (press*,birthday*,price*)>
<!-- #PCDATA:此標籤體中應該是文本-->
<!ELEMENT press (#PCDATA)>
<!ELEMENT birthday (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!-- book標籤中有一個屬性:name 必須設置(#REQUIRED)-->
<!ATTLIST book name CDATA #REQUIRED>
XML文件:
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 綁定約束 -->
<!DOCTYPE books SYSTEM "xml-dom4j/src/bookss.dtd">
<books>
<book name = "《武林祕籍》">
<press>王大師</press>
<birthday>2010-6-6</birthday>
<price>125.00</price>
</book>
<book name="《降龍十八掌》">
<press>星爺</press>
<birthday>2005-5-5</birthday>
<price>115.80</price>
</book>
</books>
約束解讀:
DOCTYPE:文檔類型
books :根標籤
SYSTEM:本地系統文件
"bookss.dtd":產生關係的文件名
book*可以寫多哥該標籤
CDATA:代表的是標籤中的屬性值爲字符型
#REQUIRED:屬性值必須設置
Schema約束
關於Schema請參照:
https://blog.csdn.net/jdbdh/article/details/82469404
使用dom4j解析
把整個xml文檔加載進內存,保留完整的結構信息,然後進行解析。
使用前:導入相關jar包
用到的API :
-
SAXReader (核心類)
-
Document read(綁定了這個xml文件的輸入流); 傳入一個輸入流,返回一個Document對象
Document對象:
- Element getRootElement(); 獲取跟標籤
Element標籤對象:
- List elements(); 獲取當前根標籤下所有的標籤
- String attributeValue(String name); 獲取標籤內屬性的value
- String elementText(String name); 獲取指定標籤的文本內容,不能是當前標籤
- String getText(); 獲取當前標籤的文本內容
xml文檔
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 綁定約束 -->
<!DOCTYPE books SYSTEM "xml-dom4j/src/bookss.dtd">
<books>
<book name = "《武林祕籍》">
<press>王大師</press>
<birthday>2010-6-6</birthday>
<price>125.00</price>
</book>
<book name="《降龍十八掌》">
<press>星爺</press>
<birthday>2005-5-5</birthday>
<price>115.80</price>
</book>
</books>
dom4j解析
public class BooksTest {
public static void main(String[] args)throws Exception {
InputStream in = BooksTest.class.getClassLoader().getResourceAsStream("books.xml");
//創建SAXRead對象
SAXReader sr = new SAXReader();
Document read = sr.read(in);
//獲取根標籤books
Element element = read.getRootElement();
//獲取books下所有book
List<Element> list = element.elements();
//遍歷所有book
for (Element e : list) {
String name = e.attributeValue("name");
String press = e.elementText("press");
String birthday = e.elementText("birthday");
String price = e.elementText("price");
System.out.println("書名:" + name + " 出版設:" + press + " 出版日期:" + birthday + " 價格:" + price);
}
}
}
結果:
書名:《武林祕籍》 出版設:王大師 出版日期:2010-6-6 價格:125.00
書名:《降龍十八掌》 出版設:星爺 出版日期:2005-5-5 價格:115.80
使用xpath解析
使用前:導入相關jar包,並且需要有dom4j的支持。
用到的方法:
- List selectNodes(String name); 獲取所有的指定標籤的內容。
- Node selectSingleNode(String name); 獲取指定標籤的第一個內容。
xml文檔
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="001">
<name id="it">
<xing>張</xing>
<ming>三</ming>
</name>
<age>18</age>
<sex>nan</sex>
</student>
<student number="002">
<name>jack</name>
<age>18</age>
<sex>nv</sex>
</student>
</students>
xpath解析
public class StudentTest {
public static void main(String[] args)throws Exception {
InputStream in = StudentTest.class.getClassLoader().getResourceAsStream("student.xml");
//獲取SAXReader對象
SAXReader sr = new SAXReader();
Document read = sr.read(in);
//獲取根標籤students
Element element = read.getRootElement();
//獲取所有age
List<Node> ages = element.selectNodes("//age");
System.out.println("age們:" + ages);
//獲取所有sex
List<Node> sexs = element.selectNodes("/students/student/sex");
System.out.println("sex們:" + sexs);
//獲取第一個sex
Node sex = element.selectSingleNode("//sex");
System.out.println("第一個sex:" + sex);
//獲取標籤是name,屬性是id的標籤
Node name = element.selectSingleNode("//name[@id]");
System.out.println("獲取的name:" + name);
}
}
結果:
age們:[org.dom4j.tree.DefaultElement@1c655221 [Element: <age attributes: []/>], org.dom4j.tree.DefaultElement@41975e01 [Element: <age attributes: []/>]]
sex們:[org.dom4j.tree.DefaultElement@726f3b58 [Element: <sex attributes: []/>], org.dom4j.tree.DefaultElement@6d9c638 [Element: <sex attributes: []/>]]
第一個sex:org.dom4j.tree.DefaultElement@726f3b58 [Element: <sex attributes: []/>]
第一個name:org.dom4j.tree.DefaultElement@4cdf35a9 [Element: <name attributes: [org.dom4j.tree.DefaultAttribute@5e265ba4 [Attribute: name id value "it"]]/>]
大家還可以參照官方文檔學習:https://www.w3school.com.cn/xml/index.asp
不好的地方還請大家指點,我給予改正。(抱拳)