2020年XML課堂筆記

XML

1. XML簡介

概念:可擴展標記語言

  • 可擴展:標籤都是程序員自定義

功能:存儲數據,作爲配置文件,在網絡中傳輸數據

注意:properties文件只能存儲小配置文件

xml與html區別

  1. xml標籤都是自定義,html標籤都是預定義
  2. xml的語法嚴格,html語法鬆散
  3. xml是用來存儲數據,html是用來展示數據

基本語法

  1. xml文檔的後綴名.xml
  2. xml第一行必須定義爲文檔聲明
  3. xml文檔中必須有且僅有一個根標籤
  4. 屬性值必須使用引號(單雙都可)引起來
  5. 標籤必須正確關閉
  6. xml標籤名稱區分大小寫

2. XML組成部分

  1. 文檔聲明

    1. 格式:<?xml 屬性列表?>
    2. 屬性列表:
      • version:版本號(必須),一般1.0
      • encoding:編碼方式。告知解析引擎當前文檔使用的字符集,默認值ISO-8859-1
      • standalone:是否依賴其他文件 yes或no
  2. 標籤:名稱自定義

    • 規則:
      1. 名稱可以包含字母、數字、其他字符
      2. 名稱不能以數字或者標點符號開始
      3. 名稱不能以xml開頭
      4. 名稱不能包含空格
  3. 屬性:id屬性唯一

  4. 文本:

    • CDATA區:原樣展示數據或代碼
    • 格式:<![CDATA[數據]]>

3.XML約束

約束:規定xml文檔的書寫規則

約束技術分類:

  1. DTD:一種簡單的約束技術
  2. Schema:一種複雜的約束技術,比DTD嚴格得多

DTD

後綴名:.dtd

使用步驟:

  1. 引入dtd文檔到xml文檔中
    • 內部dtd:將約束規則定義在xml文檔中
    • 外部dtd:將約束規則定義在外部的dtd文件中
      • 本地引入:<!DOCTYPE xml根標籤名稱 SYSTEM "dtd文件路徑">
      • 網絡引入:<!DOCTYPE xml根標籤名稱 PUBLIC "dtd文件名" "dtd文件網絡路徑URL">

Schema

後綴名:.xsd

使用步驟:

  1. 引入xsd文檔
    1. 填寫xml文檔的根標籤
    2. 引入xsi前綴。(固定格式)xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. 引入xsd文件命名空間。xsi:SchemaLocation="文件路徑 xsd文件名"
    4. 爲每一個xsd文檔聲明前綴。xmlns:起名="文件路徑"

4. 解析XML文檔

解析:操作xml文檔,將文檔中的數據讀取到內存中

  1. 操作xml文檔

    1. 解析(讀取):將文檔中的數據讀取到內存中
    2. 寫入:將內存中的數據保存到xml文檔。持久化存儲
  2. 解析xml文檔的方式

    1. DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹(一般用於服務端)
      • 優點:操作方便,可以對文檔進行CRUD的所有操作
      • 缺點:佔內存
    2. SAX:逐行讀取,讀取一行釋放一行(一般用於移動端)
      • 優點:不佔內存
      • 缺點:只能讀取,不能CRUD
  3. xml的解析器:

    1. jsoup(DOM思想):

      1. 使用步驟:

        1. 導入jar包jsoup-1.11.2.jar

          注意:文件路徑不能帶空格

        2. 獲取Document對象

        3. 獲取對應的標籤Element對象

        4. 獲取數據

xml實例代碼

<?xml version="1.0"  encoding="UTF-8"?>
<students>
    <student number="AFan_0001">
        <name id="tom">tom</name>
        <age>32</age>
        <sex>male</sex>
    </student>

    <student number="AFan_0002">
        <name id="jack">jack</name>
        <age>12</age>
        <sex>female</sex>
    </student>

    <student number="AFan_0003">
        <name id="afan">afan</name>
        <age>20</age>
        <sex>male</sex>
    </student>

</students>

jsoup實例代碼

package Afan;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

//Jsoup解析XML文檔
public class JsoupDemo01 {
    public static void main(String[] args) throws IOException {
        //1. 獲取xml文檔的路徑
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2. 解析xml文檔,加載文檔進內存,獲取dom樹
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //3. 獲取元素對象 Element
        Elements name = document.getElementsByTag("name");
        System.out.println("標籤個數:"+name.size());
        System.out.println("標籤元素:"+name.text());
    }
}

對象的使用

  1. Jsoup:工具類,可以解析或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文檔對象
  2. Document:文檔對象。代表內存中的dom樹

    • 獲取Element對象

      • getElementById(String id):根據id屬性值獲取唯一的Element對象

      • getElementsByTag(String tagName):根據標籤名稱獲取元素對象集合

      • getElementsByAttribute(String key):根據屬性名稱獲取元素對象集合

      • getElementsByAttributeValue(String key,String value):根據對應的屬性名和屬性值獲取元素對象集合

  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 arrr(String key):根據屬性名稱獲取屬性值
    3. 獲取文本內容

      • String text():獲取文本內容
      • String html():獲取標籤體的所有內容(包括子標籤的字符串內容)
  5. Node:節點對象(瞭解)

    • DocumentElement

實例代碼

package Afan;

import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

import java.io.File;
import java.io.IOException;

//Jsoup解析XML文檔
public class JsoupDemo01 {
    public static void main(String[] args) throws IOException {
        //1. 獲取xml文檔的路徑
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2. 解析xml文檔,加載文檔進內存,獲取dom樹
        Document document = Jsoup.parse(new File(path), "UTF-8");
        //根據標籤名稱name獲取元素對象
        Elements name = document.getElementsByTag("name");
        System.out.println(name);
        
        System.out.println("--------------------------");
        //獲取number屬性的元素對象
        Elements number = document.getElementsByAttribute("number");
        System.out.println(number);

        System.out.println("--------------------------");
        //獲取number=AFan_0002的元素對象
        Elements person = document.getElementsByAttributeValue("number", "AFan_0002");
        System.out.println(person);
    }
}

快捷查詢方式

  1. selector:選擇器

    • 使用方法:Elements select(String cssQuery)
      • 語法:cssQuery語法與CSS選擇器語法類似
  2. XPath:XPath即爲XML路徑語言,用於確定XML文檔的某一部分

    • 使用Jsoup的XPath需要導入jar包JsoupXpath-0.3.2.jar
    • 查詢w3school參考手冊,使用XPath的語法完成查詢

XPath的常用表達式

表達式 描述
nodename 選取nodename元素的所有子節點。
/ 從根節點選取。
// 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。
. 選取當前節點。
選取當前節點的父節點。
@ 選取屬性。

XPath實例代碼

package Afan;

import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
import java.util.List;

//Jsoup解析XML文檔
public class JsoupDemo01 {
    public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //1. 獲取xml文檔的路徑
        String path=JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
        //2. 解析xml文檔,加載文檔進內存,獲取dom樹
        Document document = Jsoup.parse(new File(path), "UTF-8");

        JXDocument jxDocument = new JXDocument(document);

        //查詢所有student標籤
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
        //查詢所有student標籤下的name標籤
        List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
        System.out.println("-----------------");
        //查詢student標籤下的id屬性爲jack的name標籤
        List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='jack']");
        for (JXNode jxNode : jxNodes3) {
            System.out.println(jxNode);
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章