javaweb入門(一) ---- XML

XML是什麼?

XML的全稱是EXtensible Markup Language (可擴展標記語言)。
編寫XML就是編寫標籤,與HTML非常類似,擴展名爲.xml
如:

// demo.xml
<employee>
    <name>李思</name>
    <age>18</age>
    <height>170</height>
</employee>

XML VS HTML

  • 二者非常相似,都是編寫標籤。
  • XML沒有預定義標籤,HTML存在大量的預定義標籤。
  • XML重在保存和傳輸數據,而HTML用於顯示信息。

XML的用途

  • 配置文件。
  • 保存程序產生的數據。
  • 網絡間的數據傳輸。

XML文檔結構

  • 第一行必須是XML聲明。
  • 有且只有一個根節點。
  • XML標籤的書寫規則與HTML相同。

XML聲明

XML聲明說明XML文檔的基本信息,包括版本號與字符集,寫在XML第一行。

在這裏插入圖片描述

<?xml version="1.0" encoding="utf-8"?>
<!-- 註釋的寫法 -->
<company>
    <employee>
        <name no="210">李思</name>
        <age>18</age>
        <department>
            <dname>研發部</dname>
            <address>西溪八方城</address>
        </department>
    </employee>
    <employee>
        <name no="210">王五</name>
        <age>20</age>
        <department>
            <dname>設計部</dname>
            <address>阿里事業部</address>
        </department>
    </employee>
</company>

在瀏覽器中可打開查看:

XML聲明在這裏插入圖片描述

XML標籤書寫規則

  1. 合法的標籤名
    標籤名要有意義。
    建議使用英文,小寫字母,單詞之間使用-分割
    建議多級標籤之間不要存在重名的情況。
    在這裏插入圖片描述

  2. 適當的註釋與縮進
    可以讓XML更容易閱讀。
    在這裏插入圖片描述
    在這裏插入圖片描述

  3. 合理使用屬性
    標籤屬性用於描述標籤不可或缺的信息。
    對標籤分組或者爲標籤設置id時常用屬性表示。
    合理使用屬性

  4. 特殊字符與CDATA標籤
    標籤體中,出現 < >這樣的字符,會破壞文檔結構。
    在這裏插入圖片描述
    解決方法1:使用實體引用
    適合特殊符號比較少的情況。
    在這裏插入圖片描述
    在這裏插入圖片描述
    解決方法2:使用CDATA標籤
    CDATA指的是不應由XML解析器進行解析的文本數據。
    從 <![CDATA[ 開始,到 ]]> 結束
    在這裏插入圖片描述
    使用CDATA標籤
    在這裏插入圖片描述

  5. 有序的子元素

在XML多層嵌套的子元素中,標籤前後順序應保持一致。
在這裏插入圖片描述

XML語義約束

XML文檔結構正確,但可能不是有效的。
例如:員工檔案XML中絕不允許出現“植物品種”標籤。XML語義約束就是用於規定XML文檔中允許出現哪些元素。
XML語義約束有兩種定義方式:DTD與XML Schema。

DTD( Document Type Definition)

DTD(文檔類型定義)是一種簡單易用的語義約束方式。
DTD文件的擴展名爲.dtd
在這裏插入圖片描述

1、 DTD定義節點

利用DTD中的<!ELEMENT>標籤,我們可以定義XML中允許出現的節點及數量,以hr.xml爲例:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

DTD定義節點數量

如某個子節點需要多次重複出現,則需要在子節點後增加相應的描述符。
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

XML引用DTD文件

在XML文件中使用<!DOCTYPE>標籤來引用DTD文件。
在這裏插入圖片描述

創建DTD文件

hr.dtd文件

<?xml version="1.0" encoding="UTF-8" ?>

<!ELEMENT company (employee+)>
        <!ELEMENT employee (name,age,department) >
            <!ELEMENT name (#PCDATA)>
            <!ELEMENT age (#PCDATA)>
            <!ELEMENT department (dname,address)>
                <!ELEMENT dname (#PCDATA)>
                <!ELEMENT address (#PCDATA)>
<!ATTLIST name no CDATA "">

hr.xml

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE company SYSTEM "hr.dtd">
<!-- 註釋的寫法 -->
<company>
    <employee>
        <name no="210">李思</name>
        <age>18</age>
        <department>
            <dname>研發部</dname>
            <address>西溪八方城</address>
        </department>
    </employee>
    <employee>
        <name no="210">王五</name>
        <age>20</age>
        <department>
            <dname>設計部</dname>
            <address>阿里事業部</address>
        </department>
    </employee>
</company>

2、 XML Schema

  • XML Schema比DTD更復雜,提供了更多功能。
  • XML Schema提供了數據雷類型、格式限定、數據範圍等特效。
  • XML Schema是W3C標準。

DOM文檔對象模型

DOM (Document Object Model) 定義了訪問和操作XML文檔的標準方法,DOM把XML文檔作爲樹結構來查看,能夠通過DOM樹來讀寫所有元素。
在這裏插入圖片描述
在這裏插入圖片描述

Dom4j

  • Dom4j是一個用於解析XML的庫,應用於java平臺,具有性能優異、功能強大和易使用的特點
  • Dom4j將XML視爲Document對象。
  • XML標籤將Dom4j定義爲Element對象。

1、Dom4j遍歷XML

1.1 下載Dom4j的jar包
1.2 將jar包添加到工程
1.3 創建測試類 HrReader.java

package dom4j;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

public class HrReader {
    public void readXml() {
        String file = "D:\\study\\player\\src\\hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(file);
            // 獲取XML文檔節點的根節點
            Element root = doc.getRootElement();
            List<Element> employees = root.elements("employee");
            for (Element employee :employees) {
                Element name = employee.element("name");
                String empName = name.getText();// getText()方法用於獲取標籤文本
                System.out.println(empName);
                System.out.println(employee.elementText("age"));
//                System.out.println(employee.elementText("salary"));
                Element department = employee.element("department");
                System.out.println(department.element("dname").getText());
                System.out.println(department.element("address").getText());
                Attribute att = name.attribute("no");
                System.out.println(att.getText());
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        HrReader reader = new HrReader();
        reader.readXml();
    }
}

2、利用Dom4j更新XML

創建HRWriter.java

package dom4j;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

public class HrReader {
    public void readXml() {
        String file = "D:\\study\\player\\src\\hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document doc = reader.read(file);
            // 獲取XML文檔節點的根節點
            Element root = doc.getRootElement();
            List<Element> employees = root.elements("employee");
            for (Element employee :employees) {
                Element name = employee.element("name");
                String empName = name.getText();// getText()方法用於獲取標籤文本
                System.out.println(empName);
                System.out.println(employee.elementText("age"));
//                System.out.println(employee.elementText("salary"));
                Element department = employee.element("department");
                System.out.println(department.element("dname").getText());
                System.out.println(department.element("address").getText());
                Attribute att = name.attribute("no");
                System.out.println(att.getText());
            }

        } catch (DocumentException e) {
            e.printStackTrace();
        }

    }

    public static void main(String[] args) {
        HrReader reader = new HrReader();
        reader.readXml();
    }
}

XPath路徑表達式

  1. XPath路徑表達式時XML文檔中查找數據的語言。
  2. XPath可以極大的提高在提取數據時的開發效率。
  3. XPath本質就是掌握各種形式表達式的使用技巧。

1、XPath基本表達式

XPath常用的基本表達式

在這裏插入圖片描述

XPath基本表達式案例

在這裏插入圖片描述

2、XPath謂語表達式

在這裏插入圖片描述

Jaxen

  • Jaxen是一個java編寫的XPath庫。這是適應多種不同的對象模型,包括DOM、XOM、dom4j、JDOM。
  • Dom4j底層依賴Jaxen實現XPath查詢
  • Jaxen下載地址 : 下載

測試XPath

XPathTest .java

package dom4j;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import java.util.List;

public class XPathTest {
    public void xpath(String xpathExp){
        String file = "D:\\study\\player\\src\\hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(file);
            List<Node> nodes = document.selectNodes(xpathExp);
            for (Node node :nodes){
                Element ele = (Element) node;
                System.out.println(ele.elementText("name"));
                System.out.println(ele.elementText("age"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        XPathTest test = new XPathTest();

//      test.xpath("/company/employee");
//      test.xpath("//employee");
//        test.xpath("//employee[age<20]");
//        test.xpath("//employee[name='李思']");
//        test.xpath("//employee[1]");
        test.xpath("//employee[last()]");
    }

}

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