從初識XML到解析XML

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&gt;b</student>

在這裏插入圖片描述

XML元素

XML 元素指的是從(且包括)開始標籤直到(且包括)結束標籤的部分,元素可包含其他元素、文本或者兩者的混合物。元素也可以擁有屬性。

在這裏插入圖片描述

XML 元素必須遵循以下命名規則:

  1. 名稱可以含字母、數字以及其他的字符。
  2. 名稱不能以數字或者標點符號開始。
  3. 名稱不能以字符 “xml”(或者 XML、Xml)開始。
  4. 名稱不能包含空格。

屬性的定義以及注意事項:

  1. 屬性必須定義在標籤體的開始標籤體內。
  2. 以鍵值對的方式定義,值必須用引號引起來( 屬性名=“屬性值”)。
  3. 一個標籤中可以有多個屬性,但是不能有同名的屬性。
  4. 屬性名不能使用空格、冒號等特殊字符,且必須以字母開頭。

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

不好的地方還請大家指點,我給予改正。(抱拳)

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