JavaWeb——XML入門詳解(概述、語法、約束、Jsoup解析、Xpath解析)

目錄

1、XML概述

1)xml宇html的區別?

2)xml的語法

3)xml的組成部分

2、XML約束

3、XML解析

1)解析xml的方式

2)常見的解析器

3)Jsoup解析器


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);
        }
    }
}

 

本文爲博主原創文章,轉載請註明出處!

若本文對您有些許幫助,輕擡您發財的小手,關注/評論/點贊/收藏,就是對我最大的支持!

祝君升職加薪,鵬程萬里!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章