XML
1. XML簡介
概念:可擴展標記語言
- 可擴展:標籤都是程序員自定義
功能:存儲數據,作爲配置文件,在網絡中傳輸數據
注意:
properties
文件只能存儲小配置文件
xml與html區別
- xml標籤都是自定義,html標籤都是預定義
- xml的語法嚴格,html語法鬆散
- xml是用來存儲數據,html是用來展示數據
基本語法
- xml文檔的後綴名
.xml
- xml第一行必須定義爲文檔聲明
- xml文檔中必須有且僅有一個根標籤
- 屬性值必須使用引號(單雙都可)引起來
- 標籤必須正確關閉
- xml標籤名稱區分大小寫
2. XML組成部分
-
文檔聲明
- 格式:
<?xml 屬性列表?>
- 屬性列表:
version
:版本號(必須),一般1.0encoding
:編碼方式。告知解析引擎當前文檔使用的字符集,默認值ISO-8859-1
standalone
:是否依賴其他文件 yes或no
- 格式:
-
標籤:名稱自定義
- 規則:
- 名稱可以包含字母、數字、其他字符
- 名稱不能以數字或者標點符號開始
- 名稱不能以xml開頭
- 名稱不能包含空格
- 規則:
-
屬性:id屬性唯一
-
文本:
- CDATA區:原樣展示數據或代碼
- 格式:
<![CDATA[數據]]>
3.XML約束
約束:規定xml文檔的書寫規則
約束技術分類:
- DTD:一種簡單的約束技術
- Schema:一種複雜的約束技術,比DTD嚴格得多
DTD
後綴名:.dtd
使用步驟:
- 引入dtd文檔到xml文檔中
- 內部dtd:將約束規則定義在xml文檔中
- 外部dtd:將約束規則定義在外部的dtd文件中
- 本地引入:
<!DOCTYPE xml根標籤名稱 SYSTEM "dtd文件路徑">
- 網絡引入:
<!DOCTYPE xml根標籤名稱 PUBLIC "dtd文件名" "dtd文件網絡路徑URL">
- 本地引入:
Schema
後綴名:.xsd
使用步驟:
- 引入xsd文檔
- 填寫xml文檔的根標籤
- 引入xsi前綴。(固定格式)
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- 引入xsd文件命名空間。
xsi:SchemaLocation="文件路徑 xsd文件名"
- 爲每一個xsd文檔聲明前綴。
xmlns:起名="文件路徑
"
4. 解析XML文檔
解析:操作xml文檔,將文檔中的數據讀取到內存中
-
操作xml文檔
- 解析(讀取):將文檔中的數據讀取到內存中
- 寫入:將內存中的數據保存到xml文檔。持久化存儲
-
解析xml文檔的方式
- DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹(一般用於服務端)
- 優點:操作方便,可以對文檔進行CRUD的所有操作
- 缺點:佔內存
- SAX:逐行讀取,讀取一行釋放一行(一般用於移動端)
- 優點:不佔內存
- 缺點:只能讀取,不能CRUD
- DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹(一般用於服務端)
-
xml的解析器:
-
jsoup(DOM思想):
-
使用步驟:
-
導入jar包
jsoup-1.11.2.jar
注意:文件路徑不能帶空格
-
獲取Document對象
-
獲取對應的標籤Element對象
-
獲取數據
-
-
-
xml實例代碼
<?xml version="1.0" encoding="UTF-8"?>
<students>
<student number="AFan_0001">
<name id="tom">tom</name>
<age>32</age>
<sex>male</sex>
</student>
<student number="AFan_0002">
<name id="jack">jack</name>
<age>12</age>
<sex>female</sex>
</student>
<student number="AFan_0003">
<name id="afan">afan</name>
<age>20</age>
<sex>male</sex>
</student>
</students>
jsoup實例代碼
package Afan;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
//Jsoup解析XML文檔
public class JsoupDemo01 {
public static void main(String[] args) throws IOException {
//1. 獲取xml文檔的路徑
String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
//2. 解析xml文檔,加載文檔進內存,獲取dom樹
Document document = Jsoup.parse(new File(path), "UTF-8");
//3. 獲取元素對象 Element
Elements name = document.getElementsByTag("name");
System.out.println("標籤個數:"+name.size());
System.out.println("標籤元素:"+name.text());
}
}
對象的使用
-
Jsoup
:工具類,可以解析或xml文檔,返回Document
對象parse
方法:解析html或xml文檔,返回Documentparse(File in,String charsetName)
:根據字符集解析xml或html文檔parse(String html)
:解析xml或html文檔字符串parse(URL url,int timeoutMillis)
:通過網絡路徑獲取指定的html或xml文檔對象
-
Document
:文檔對象。代表內存中的dom樹-
獲取
Element
對象-
getElementById(String id)
:根據id屬性值獲取唯一的Element對象 -
getElementsByTag(String tagName)
:根據標籤名稱獲取元素對象集合 -
getElementsByAttribute(String key)
:根據屬性名稱獲取元素對象集合 -
getElementsByAttributeValue(String key,String value)
:根據對應的屬性名和屬性值獲取元素對象集合
-
-
-
Elements
:元素Element對象的集合。相當於ArrayList<Element>
-
Element
:元素對象-
獲取子元素對象
-
getElementById(String id)
:根據id屬性值獲取唯一的Element對象 -
getElementsByTag(String tagName)
:根據標籤名稱獲取元素對象集合 -
getElementsByAttribute(String key)
:根據屬性名稱獲取元素對象集合 -
getElementsByAttributeValue(String key,String value)
:根據對應的屬性名和屬性值獲取元素對象集合
-
-
獲取屬性值
String arrr(String key)
:根據屬性名稱獲取屬性值
-
獲取文本內容
String text()
:獲取文本內容String html()
:獲取標籤體的所有內容(包括子標籤的字符串內容)
-
-
Node
:節點對象(瞭解)- 是
Document
和Element
- 是
實例代碼
package Afan;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
//Jsoup解析XML文檔
public class JsoupDemo01 {
public static void main(String[] args) throws IOException {
//1. 獲取xml文檔的路徑
String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
//2. 解析xml文檔,加載文檔進內存,獲取dom樹
Document document = Jsoup.parse(new File(path), "UTF-8");
//根據標籤名稱name獲取元素對象
Elements name = document.getElementsByTag("name");
System.out.println(name);
System.out.println("--------------------------");
//獲取number屬性的元素對象
Elements number = document.getElementsByAttribute("number");
System.out.println(number);
System.out.println("--------------------------");
//獲取number=AFan_0002的元素對象
Elements person = document.getElementsByAttributeValue("number", "AFan_0002");
System.out.println(person);
}
}
快捷查詢方式
-
selector
:選擇器- 使用方法:
Elements select(String cssQuery)
- 語法:cssQuery語法與CSS選擇器語法類似
- 使用方法:
-
XPath
:XPath即爲XML路徑語言,用於確定XML文檔的某一部分- 使用Jsoup的XPath需要導入jar包
JsoupXpath-0.3.2.jar
- 查詢w3school參考手冊,使用XPath的語法完成查詢
- 使用Jsoup的XPath需要導入jar包
XPath的常用表達式
表達式 | 描述 |
---|---|
nodename | 選取nodename元素的所有子節點。 |
/ | 從根節點選取。 |
// | 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。 |
. | 選取當前節點。 |
… | 選取當前節點的父節點。 |
@ | 選取屬性。 |
XPath實例代碼
package Afan;
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
import java.util.List;
//Jsoup解析XML文檔
public class JsoupDemo01 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//1. 獲取xml文檔的路徑
String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
//2. 解析xml文檔,加載文檔進內存,獲取dom樹
Document document = Jsoup.parse(new File(path), "UTF-8");
JXDocument jxDocument = new JXDocument(document);
//查詢所有student標籤
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("-----------------");
//查詢所有student標籤下的name標籤
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("-----------------");
//查詢student標籤下的id屬性爲jack的name標籤
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='jack']");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
}
}