目錄
1、XML概述
XML,Extensible Markup Language可擴展標記語言(也是由w3c(萬維網聯盟)推出的)。可擴展,標籤都是自定義的,如<uesr>、<student>。其主要功能就是存儲數據,用於配置文件使用,另外存儲的數據可以在網絡中傳輸。
1)xml宇html的區別?
- xml標籤都是自定義的,html標籤是預定義的;
- xml語法嚴格,html語法鬆散;
- xml是存儲數據的,html是展示數據;
2)xml的語法
- xml的後綴名爲 .xml
- xml的第一行必須定義爲文檔聲明
- xml文檔中有且僅有一個根標籤
- 屬性值必須用引號(單雙均可)引起來
- 標籤必須正確關閉(自閉和或圍堵標籤)
- xml標籤名稱區分大小寫
【舉例】:xml語法
<?xml version='1.0' ?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>10</age>
<gender>male</gender>
</user>
<user id='2'>
<name>lisi</name>
<age>11</age>
<gender>female</gender>
</user>
</users>
3)xml的組成部分
1、文檔聲明
格式:<?xml 屬性列表 ?>
屬性列表:version,版本號,必須 屬性,當前爲1.0
encoding,編碼方式,告知解析引擎當前文檔使用的字符集,默認爲ISO-8859-1
standalone,是否獨立,值爲yes表示不依賴其他文件,值爲no表示依賴其他文件。
2、指令(瞭解):結合CSS的
3、標籤:名稱自定義的, 規則:
- 名稱可以包含字母、數字以及其他的字符
- 名稱不能以數字或者標點符號開始
- 名稱不能以字母 xml(或者 XML、Xml 等等)開始
- 名稱不能包含空格
4、屬性:id屬性值唯一
5、文本:CDATA區:在該區域中 數據會被原樣展示<![CDATA[ 數據 ]]>
2、XML約束
約束是規定xml文檔的書寫規則,作爲框架的使用者(程序員),需要能夠在xml中引入約束文檔,且能夠簡單的讀懂約束文檔。約束技術的分類:
- DTD:一種簡單的約束技術
- Schema:一種複雜的約束技術
1)DTD,引入dtd文檔到到xml文檔中:
內部dtd:將約束規則定義在xml文檔中(瞭解,不常用)
外部dtd:將約束規則定義在外部的dtd文件中
本地:<!DOCTYPE 跟標籤名 SYSTEM "dtd文件的位置">
網絡:<!DOCTYPE 跟標籤名 PUBLIC "dtd文件名字" "dtd文件位置URL">
2)Schema,引入schema文檔到xml:
1.填寫xml文檔的根元素
2.引入xsi前綴. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3.引入xsd文件命名空間. xsi:schemaLocation="http://www.itcast.cn/xml student.xsd"
4.爲每一個xsd約束聲明一個前綴,作爲標識 xmlns="http://www.itcast.cn/xml"
<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.itcast.cn/xml"
xsi:schemaLocation="http://www.itcast.cn/xml student.xsd">
3、XML解析
解析,指的是操作xml文檔,將文檔中的數據讀取到內存中,操作xml文檔操作方式有兩種:
- 解析(讀取):將文檔中的數據讀取到內存中;
- 寫入:將內存中的數據保存到xml文檔中,持久化的存儲。
1)解析xml的方式
1、DOM:將標記語言文檔一次性加載至內存,在內存中形成一顆dom樹
優點:操作方便,可以對文檔進行CRUD的所有操作,一般用於服務器
缺點:佔內存
2、SAX:逐行讀取,基於事件驅動
優點:不佔內存,適用於內存較小的設備,如手機
缺點:只能讀取,不能增刪改。
2)常見的解析器
- JAXP:DOM方式解析,SUN公司提供,支持dom和sax兩種思想,性能不佳,基本不用;
- DOM4J:DOM方式解析,一款優秀的解析器
- Jsoup:DOM方式解析,jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
- PULL:SAX方式解析,Android內置的解析器。
3)Jsoup解析器
1、Jsoup是免費的第三方開源解析器,快速入門步驟:
- 導入jar包;
- 獲取Document對象:
- 獲取對應的標籤,Element對象;
- 獲取數據。
【舉例】:Jsoup解析器讀取sudent.xml文檔內容
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//獲取document對象,根據xml文檔
//獲取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//解析xml文檔,加載文檔進內存,獲取dom樹;
Document document = Jsoup.parse(new File(path), "utf-8");
//獲取元素對象Element
Elements elements = document.getElementsByTag("name");
System.out.println("個數:"+elements.size());
Element element = elements.get(0);
String name = element.text();
System.out.println("name:"+name);
}
}
2、對象的使用
- Jsoup:是一個工具類,可以解析html或xml文檔,返回Docment對象;
*parse:解析html或xml文檔,返回Document;
parse(File in, String charsetName),解析html或xml文件的
parse(String html),解析html或xml字符串的,參數html實際就是文檔的內容;
parse(URL url, int timeoutMillis),通過網絡路徑獲取指定的html或xml的文檔對象;
URL url = new URL("https://baike.baidu.com/item/jsoup/9012509?fr=aladdin");
Document document = Jsoup.parse(url, 20000);
System.out.println(document);
- Document:文檔對象,代表內存中的dom樹;
*獲取Element對象
getElementByITag(String tagName),根據標籤名獲取元素對象集合
getElementByAttribute(String key),根據屬性名稱獲取元素對象集合
getElementsByAttributeValue(String key,String value),根據對應的屬性名和屬性值獲取元素對象集合
getElementById(String id),根據id屬性值獲取唯一的Element對象 - Elements:元素Element對象的集合,可以當作ArrayList<Element>使用;
- Element:元素對象
*獲取子元素對象
getElementByITag(String tagName),根據標籤名獲取元素對象集合
getElementByAttribute(String key),根據屬性名稱獲取元素對象集合
getElementsByAttributeValue(String key,String value),根據對應的屬性名和屬性值獲取元素對象集合
getElementById(String id),根據id屬性值獲取唯一的Element對象
*獲取屬性值
attr(String key),根據屬性名稱獲取屬性值
*獲取文本內容
text(),獲取所有子標籤的純文本內容
html(),獲取便籤體的所有內容(包括子標籤的標籤和文本內容) - Node:節點對象,是Document和Element的父類
3、Jsoup快捷查詢方式
- selector選擇器
使用方法:Elements select(String query),語法參考Selector類中定義的語法
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//獲取document對象,根據xml文檔
//獲取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//查詢name標籤
Elements elements = document.select("name");
System.out.println(elements);
//查詢id值爲001
Elements element = document.select("001");
System.out.println(element);
//獲取student標籤,且number屬性值爲s001的age子標籤
Elements elements1 = document.select("student[number='s001'] > age");
System.out.println(elements1);
}
}
- Xpath:XPath即爲XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言。
注意:使用Jsoup的Xpath需要額外導入jar包,查詢w3cschool參考手冊,使用Xpath語法完成查詢。
public class JsoupDemo1 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//獲取document對象,根據xml文檔
//獲取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//創建JXDocument對象
JXDocument jxDocument = new JXDocument(document);
//結合Xpath語法查詢
//查詢所有student便籤
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
//查詢所有student便籤下name標籤
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
//查詢student標籤下帶id屬性的name標籤
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
//查詢student標籤下帶id屬性的name標籤,且id屬性值爲001
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='001']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}
}
}
本文爲博主原創文章,轉載請註明出處!
若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!
祝君升職加薪,鵬程萬里!