天天看點

【JavaWeb】XML基礎入門

這篇博文是關于XML基礎入門,内容有XML概念、文法、解析XML文檔。

本文目錄

    • 一.XML概念
    • 二.XML文法
      • 2.1 基本文法規則:
      • 2.2 快速入門
      • 2.3 xml文檔的組成部分
    • 三.XML文檔的限制
    • 四.XML文檔解析
      • 3.1 xml常見的解析器:
      • 3.2 快捷查詢方式

一.XML概念

XML:

Extensible Markup Language

可擴充标記語言。由W3C(網際網路聯盟)釋出。

可擴充含義:标簽都是自定義的。 如:

<user> <student>

XML主要功能是存儲資料:

  • XML配置檔案
  • 檔案可以在網絡中傳輸

xml與html的差別:

  1. xml标簽都是自定義的,html标簽是預定義(已經定義好的)。
  2. xml的文法嚴格,html文法松散。很容易寫錯。
  3. xml是存儲資料的,html是展示資料。XML也可以展示資料,由于文法嚴格,不常用。

XML最開始的目标是想替換HTML的。XML的文法比HTML嚴格。用标簽去存儲資訊,嚴禁而且閱讀性高。

二.XML文法

2.1 基本文法規則:

  1. xml文檔的字尾名 .xml
  2. xml第一行必須定義為文檔聲明
  3. xml文檔中有且僅有一個根标簽
  4. 标簽的屬性值必須使用引号(單雙都可)引起來
  5. 标簽必須正确關閉(自閉和、或者是圍堵标簽)
  6. xml标簽名稱區分大小寫

2.2 快速入門

<?xml version='1.0' encoding='utf-8' ?> <--! 文檔聲明 -->
         
         <?xml-stylesheet type=test/css href= "a.css" ?><--! 設定xml的樣式,在a.css設定元素樣式-->
          
		<users>
			<user id='1'>
				<name>zhangsan</name>
				<age>23</age>
				<gender>male</gender>
				<br/>
			</user>
			
			<user id='2'>
				<name>lisi</name>
				<age>24</age>
				<gender>female</gender>
			</user>
		</users>
           

2.3 xml文檔的組成部分

1. 文檔聲明
			1. 格式:<?xml 屬性清單 ?> (<和?之間不能有空格,否則會報錯)
			2. 屬性清單:
				* version:版本号,必須要的屬性,1.0夠用了
				* encoding:編碼方式。告知解析引擎目前文檔使用的字元集,預設值:ISO-8859-1。必須保證xml文檔的編碼和解碼一緻,否則亂碼。
				* standalone:是否獨立(一般不需要)
					* 取值:
						* yes:不依賴其他檔案
						* no:依賴其他檔案
						
		2. 指令(了解):結合css的
			* <?xml-stylesheet type="text/css" href="a.css" target="_blank" rel="external nofollow"  ?>
			
		3. 标簽:标簽名稱自定義的
			* 規則:
				* 名稱可以包含字母、數字以及其他的字元 
				* 名稱不能以數字或者标點符号開始 
				* 名稱不能以字母 xml(或者 XML、Xml 等等)開始 
				* 名稱不能包含空格 

		4. 屬性:
			id屬性值唯一
			
		5. 文本:
			* CDATA區:在該區域中的資料會被原樣展示
				* 格式:  <![CDATA[ 資料 ]]>
           

檢驗XML檔案是否編寫正确,用浏覽器打開XML檔案,可以正确顯示内容,說明編寫正确。不能顯示,則存在問題。

三.XML文檔的限制

限制就是規定xml文檔的書寫規則。

【JavaWeb】XML基礎入門

作為架構的使用者(程式員)的要求:

  • 能夠在xml中引入限制文檔
  • 能夠簡單的讀懂限制文檔

限制分類:

  1. DTD

    :一種簡單的限制技術
  2. Schema

    :一種複雜的限制技術

DTD:

引入dtd文檔到xml文檔中

  • 内部dtd:将限制規則定義在xml文檔中
  • 外部dtd:将限制的規則定義在外部的dtd檔案中,使用時需要在文檔頂部引入.dtd檔案
    • 本地:
    • 網絡:

本地方式:

student.dtd文檔

<!ELEMENT students (student+) > <!--表明xml裡面的标簽體,根标簽-->
<!ELEMENT student (name,age,sex)> <!--student裡面有什麼屬性,出現的順序-->
<!ELEMENT name (#PCDATA)>         <!--name、age、sex的類型為字元串-->
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> <!--student number id 唯一-->
           

student.xml文檔

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd"> <!--外部dtd限制-->

<!-- 内部dtd限制
   <!DOCTYPE students [
      <!ELEMENT students (student+) >
      <!ELEMENT student (name,age,sex)>
      <!ELEMENT name (#PCDATA)>
      <!ELEMENT age (#PCDATA)>
      <!ELEMENT sex (#PCDATA)>
      <!ATTLIST student number ID #REQUIRED>
      ]>-->
<students>
   <student number="s001">
      <name>zhangsan</name>
      <age>abc</age>
      <sex>hehe</sex>
   </student>

   <student number="s002">
      <name>lisi</name>
      <age>24</age>
      <sex>female</sex>
   </student>
</students>
           

Schema:

引入:

1.填寫xml文檔的根元素
	
	2.引入xsi字首.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			字首有固定的格式,xsi的取值有很多種
			
	3.引入xsd檔案命名空間.  xsi:schemaLocation="http://www.itcast.cn/xml  student.xsd"
	xsi:schemaLocation的路徑為  student.xsd,
	"[http://www.baidu.com/xml](http://www.itcast.cn/xml) 是 student.xsd 的名稱空間 (命名空間)
	
	4.為每一個xsd限制聲明一個字首,作為辨別  xmlns="http://www.itcast.cn/xml" 
		如果隻有一個命名空間:字首可以有名字也可以沒有名字
		如果有多個命名空間:要有不同的命名空間
		xmlns a:="http://www.itcast.cn/xml"   -->a: 就是命名空間
           

例如:

​	<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">
           

student.xsd文檔

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.itcast.cn/xml" elementFormDefault="qualified">
    <xsd:element name="students" type="studentsType"/> <!--自定義标簽的名字和類型-->
    <xsd:complexType name="studentsType">
        <xsd:sequence>
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">
        <xsd:sequence> <!--自定義标簽和值的類型-->
            <xsd:element name="name" type="xsd:string"/> <!--name标簽的值是字元串類型-->
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/> <!--自定義标簽值的範圍-->
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/> <!--自定義标簽值的範圍-->
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="heima_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 

           

student.xml文檔

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 
   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"
>
   <student number="heima_0001">
      <name>tom</name>
      <age>18</age>
      <sex>male</sex>
   </student>
</students>
           

四.XML文檔解析

XML解析:操作xml文檔,将文檔中的資料讀取到記憶體中

  • 操作xml文檔
    1. 解析(讀取):将文檔中的資料讀取到記憶體中
    2. 寫入:将記憶體中的資料儲存到xml文檔中。持久化的存儲
  • 解析xml的方式:
    1. DOM:将标記語言文檔一次性加載進記憶體,在記憶體中形成一顆dom樹
      • 優點:操作友善,可以對文檔進行CRUD的所有操作
      • 缺點:占記憶體,dom會一次性的加載所有文檔進入記憶體,dom樹占記憶體
      【JavaWeb】XML基礎入門
    2. SAX:逐行讀取,基于事件驅動的。優點:不占記憶體。 缺點:隻能讀取,不能增删改
      【JavaWeb】XML基礎入門

3.1 xml常見的解析器:

  1. JAXP

    :sun公司提供的解析器,支援dom和sax兩種思想
  2. DOM4J

    :一款非常優秀的解析器
  3. Jsoup

    :jsoup 是一款Java 的HTML解析器,可直接解析某個URL位址、HTML文本内容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作資料。
  4. PULL

    :Android作業系統内置的解析器,sax方式的。

Jsoup

:jsoup 是一款Java 的HTML解析器,可直接解析某個URL位址、HTML文本内容。它提供了一套非常省力的API,可通過DOM,CSS以及類似于jQuery的操作方法來取出和操作資料。

  • 快速入門步驟:

    1. 導入jar包

    2. 擷取Document對象

    3. 擷取對應的标簽Element對象

    4. 擷取資料

  • 代碼示例:

    student.xml文檔

    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE students SYSTEM "student.dtd">
    
    <students>
      <student number="_0001">
      <name>張三</name>
         <age>18</age>
         <sex>male</sex>
      </student>
      <student number="_0002">
         <name>jack</name>
         <age>18</age>
      <sex>female</sex>
    	   </student>
    	</students>
    	```
    
               

解析student.xml

public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //2.擷取Document對象,根據xml文檔擷取
        //2.1 擷取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("Jsoup/student.xml").getPath();
        //2.2 解析xml文檔,加載文檔進記憶體,擷取Dom數-->Document
        Document document = Jsoup.parse(new File(path),"utf-8");
        
        //3.擷取元素對象Element
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());//2

        //3.1 擷取第一個name的Elemetn對象
        Element element = elements.get(0);
        //3.2 擷取資料
        String name = element.text();
        System.out.println(name);//張三
    }
}
           

對象的使用:

  1. Jsoup:工具類,可以解析html或xml文檔,傳回Document
    • parse:解析html或xml文檔,傳回Document
      • parse​(File in, String charsetName)

        :解析xml或html檔案的。
      • parse​(String html)

        :解析xml或html字元串
      • parse​(URL url, int timeoutMillis)

        :通過網絡路徑擷取指定的html或xml的文檔對象
    /**
     * Jsoup對象功能
     * 1.解析xml文檔,加載文檔進記憶體,擷取dom樹--->Document
     * 2.parse(String html):解析xml或html字元串
     * 3.parse(URL url, int timeoutMillis):通過網絡路徑擷取指定的html或xml的文檔對象
     */
    public class JsoupDemo2 {
        public static void main(String[] args) throws IOException {
            //0.擷取Document對象,根據xml文檔擷取
            //0.1 擷取student.xml的path
            String path = JsoupDemo2.class.getClassLoader().getResource("Jsoup/student.xml").getPath();
            
            //1. 解析xml文檔,加載文檔進記憶體,擷取Dom數-->Document
            Document document = Jsoup.parse(new File(path),"utf-8");
            System.out.println(document);
    
            //2.parse(String html):解析xml或html字元串
             String str = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n" +
                    "\n" +
                    "<students>\n" +
                    "\t<student number=\"heima_0001\">\n" +
                    "\t\t<name>tom</name>\n" +
                    "\t\t<age>18</age>\n" +
                    "\t\t<sex>male</sex>\n" +
                    "\t</student>\n" +
                    "\t<student number=\"heima_0002\">\n" +
                    "\t\t<name>jack</name>\n" +
                    "\t\t<age>18</age>\n" +
                    "\t\t<sex>female</sex>\n" +
                    "\t</student>\n" +
                    "\n" +
                    "</students>";
            Document document1 = Jsoup.parse(str);
            System.out.println(document);
    
            //3.parse(URL url, int timeoutMillis):通過網絡路徑擷取指定的html或xml的文檔對象
            URL url = new URL("https://baike.baidu.com/item/jsoup/9012509?fr=aladdin");//代表網絡中的一個資源路徑
            Document document3 = Jsoup.parse(url, 10000);
            System.out.println(document3);
        }
    }
               
  2. Document:文檔對象。代表記憶體中的dom樹
    • 擷取Element對象
      • getElementById​(String id)

        :根據id屬性值擷取唯一的element對象
      • getElementsByTag​(String tagName)

        :根據标簽名稱擷取元素對象集合
      • getElementsByAttribute​(String key)

        :根據屬性名稱擷取元素對象集合
      • getElementsByAttributeValue​(String key, String value)

        :根據對應的屬性名和屬性值擷取元素對象集合
    /**
     * Document/Element對象功能
     */
    public class JsoupDemo3 {
        public static void main(String[] args) throws IOException {
            //2.擷取Document對象,根據xml文檔擷取
            //2.1 擷取student.xml的path
            String path = JsoupDemo3.class.getClassLoader().getResource("Jsoup/student.xml").getPath();
            //2.2 解析xml文檔,加載文檔進記憶體,擷取Dom數-->Document
            Document document = Jsoup.parse(new File(path),"utf-8");
            
            //3.擷取元素對象了。
            //3.1擷取所有student對象
            Elements elements = document.getElementsByTag("student");
            System.out.println(elements);
            System.out.println("======================");
            
            //3.2 擷取屬性名為id的元素對象們
            Elements elements1 = document.getElementsByAttribute("id");
            System.out.println(elements1);
            System.out.println("=======================");
            
            //3.3 擷取 number屬性值為dab的元素對象
            Elements elements2 = document.getElementsByAttributeValue("number", "_0001");
            System.out.println(elements2);
            System.out.println("========================");
            
            //3.4 擷取id屬性值的元素對象
            Element dab = document.getElementById("dab");
            System.out.println(dab);
        }
    }
               
  3. Elements:元素Element對象的集合。可以當做

    ArrayList<Element>

    來使用
  4. Element:元素對象
    1. 擷取子元素對象
      • getElementById​(String id)

        :根據id屬性值擷取唯一的element對象
      • getElementsByTag​(String tagName)

        :根據标簽名稱擷取元素對象集合
      • getElementsByAttribute​(String key)

        :根據屬性名稱擷取元素對象集合
      • getElementsByAttributeValue​(String key, String value)

        :根據對應的屬性名和屬性值擷取元素對象集合
    2. 擷取屬性值
      • String attr(String key)

        :根據屬性名稱擷取屬性值
    3. 擷取文本内容
      • String text()

        :擷取文本内容
      • String html()

        :擷取标簽體的所有内容(包括字标簽的字元串内容)
/**
* Demo
*/
public class JsoupDemo4 {
    public static void main(String[] args) throws IOException {
        //1.擷取student.xml的path
        String path = Objects.requireNonNull(JsoupDemo4.class.getClassLoader().getResource("Jsoup/student.xml")).getPath();
        //2.擷取Document對象
        Document document = Jsoup.parse(new File(path), "utf-8");

        //通過Document對象擷取name标簽,擷取所有的name标簽,可以擷取到兩個
        Elements elements = document.getElementsByTag("name");
        System.out.println(elements.size());//2
        System.out.println("===============");
        //通過Element對象擷取子标簽對象
        Element student = document.getElementsByTag("student").get(0);
        Elements name = student.getElementsByTag("name");
        System.out.println(name.size());//1

        //擷取student對象的屬性值
        String number = student.attr("NUMBER");
        System.out.println(number);//_0001
        System.out.println("=================");

        //擷取文本内容
        String text = name.text();
        String html = name.html();
        System.out.println(text);//張三
        System.out.println(html);//張三
    }
}
           

5.Node:節點對象

  • 是Document和Element的父類

3.2 快捷查詢方式

​ 1. selector:選擇器

  • 使用的方法:

    Elements select​(String cssQuery)

  • 文法:參考Selector類中定義的文法
/*
    元素選擇器查詢
    比如:div{}
 */
public class JsoupDemo5 {
    public static void main(String[] args) throws IOException {
        //1.擷取student.xml的path
        String path = JsoupDemo5.class.getClassLoader().getResource("Jsoup/student.xml").getPath();
        //2.擷取Document對象
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.查詢name标簽
        Elements elements = document.select("name");//标簽選擇器
        System.out.println(elements);
        System.out.println("=================");

        //4.查詢id值為dab的元素
        Elements elements1 = document.select("#dab");
        System.out.println(elements1);

        //5.擷取student标簽并且number屬性值為_0001的age子标簽
        //5.1.擷取student标簽并且number屬性值為_0001
        Elements elements2 = document.select("student[number='_0001']");
        System.out.println(elements2);
        System.out.println("===================");
        //5.2擷取student标簽并且number屬性值為_0001的age子标簽
        Elements elements3 = document.select("student[number='_0001'] age");
        System.out.println(elements3);
    }
}
           

2.XPath:XPath即為XML路徑語言,它是一種用來确定XML(标準通用标記語言的子集)文檔中某部分位置的語言

  • 使用Jsoup的Xpath需要額外導入jar包。
  • 查詢w3cshool參考手冊,使用xpath的文法完成查詢

    代碼示例:

    /*
        XPath查詢
     */
    public class JsoupDemo6 {
        public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
            //1.擷取student.xml的path
            String path = Objects.requireNonNull(JsoupDemo6.class.getClassLoader().getResource("Jsoup/student.xml")).getPath();
            //2.擷取Document對象
            Document document = Jsoup.parse(new File(path), "utf-8");
            //3.根據document,建立JXDocument對象
            JXDocument jxDocument = new JXDocument(document);
    
            //4.結合xpath文法查詢
            //4.1 查詢所有student标簽
            List<JXNode> jxNodes = jxDocument.selN("//student");
            for (JXNode jxNode : jxNodes) {
                System.out.println(jxNode);
            }
            System.out.println("==================");
    
            //4.2 查詢所有student标簽下的name标簽
            List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
            for (JXNode jxNode : jxNodes1) {
                System.out.println(jxNode);
            }
            System.out.println("==================");
    
            //4.3查詢student标簽下帶有id屬性的name标簽
            List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
            for (JXNode jxNode : jxNodes2) {
                System.out.println(jxNode);
            }
            System.out.println("==================");
    
            //4.4查詢student标簽下帶有id屬性的name标簽 并且id屬性值為dab
            List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='dab']");
            for (JXNode jxNode : jxNodes3) {
                System.out.println(jxNode);
            }
        }
    }
               

以上就是關于XML基礎入門,内容有XML概念、文法、解析XML文檔,相對全面。XML知識對于後端程式員了解即可。

歡迎點贊評論,指出不足,筆者由衷感謝哦!~