XML語法和解析



第一章:XML概述

概念

XML( Extensible Markup Language ),可擴展的標記語言。是一種用於標記電子文件使其具有結構性的標記語言,它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言 。1998年2月10日,W3C(World WideⅥiebConsortium,萬維網聯盟)公布XML 1.0標准,XML誕生了。

用途

XML可以用來存儲數據, 它非常適合萬維網傳輸,提供統一的方法來描述交換獨立於應用程序或供應商的結構化數據。是Internet環境中跨平台的、依賴於內容的技術,也是當今處理分布式結構信息的有效工具。
應用場景主要體現在以下兩個方面。

  1. 配置文件
  2. 網絡傳輸

XML和HTML的區別

  1. xml標簽都是自定義的,html標簽是預定義。
  2. xml的語法嚴格,html語法松散
  3. xml是存儲數據的,html是展示數據

第二章:XML語法

2.1-基本語法

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

2.2-快速入門Demo

定義一個XML文件,用來存儲一組學生信息

<?xml version="1.0" encoding="utf-8" ?>
<students>
    <student id="1">
        <name>張三</name>
        <age>10</age>
        <sex>male</sex>
    </student>
    <student id="2">
        <name>李四</name>
        <age>12</age>
        <sex>female</sex>
    </student>
</students>

2.3-組成部分

文檔聲明

  • 格式:<?xml 屬性列表 ?>
  • 屬性:
    • version:版本號,必須的屬性
    • encoding:編碼方式。告知解析引擎當前文檔使用的字符集,默認值:ISO-8859-1
    • standalone:是否獨立,取值兩個如下:
      • yes,不依賴其他文件
      • no,依賴其他文件

指令

結合css

<?xml-stylesheet type="text/css" href="css文件路徑" ?>

標簽名規則

  • 名稱可以包含字母、數字以及其他的字符
  • 名稱不能以數字或者標點符號開始
  • 名稱不能以字母 xml(或者 XML、Xml 等等)開始
  • 名稱不能包含空格

屬性

id屬性值唯一

文本

CDATA區:在該區域中的數據會被原樣展示

格式:<![CDATA[ 數據 ]]>

第三章:XML約束(了解)

3.1-概述

目標

作為框架的使用者(程序員)

  1. 能夠在xml中引入約束文檔
  2. 能夠簡單的讀懂約束文檔

分類

  1. DTD:一種簡單的約束技術
  2. Schema:一種復雜的約束技術

3.2-DTD約束

引入dtd文檔到xml文檔中兩種方式

  1. 內部dtd:將約束規則定義在xml文檔中
  2. 外部dtd:將約束的規則定義在外部的dtd文件中
    • 本地:<!DOCTYPE 根標簽名 SYSTEM "dtd文件的位置">
    • 網絡:<!DOCTYPE 根標簽名 PUBLIC "dtd文件名字" "dtd文件的位置URL">

演示

DTD文件-student.dtd

<!--
    規定根元素是students
    子元素是student,並且子元素可以出現0次或多次
-->
<!ELEMENT students (student*) >
<!--
    規定元素student有三個子元素分別是:name,age,sex
-->
<!ELEMENT student (name,age,sex)>
<!--在name,age,sex標簽中可以插入字符和子標簽-->
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!--
 給student元素定義屬性number,類型為id,這個默認是必須的
-->
<!ATTLIST student number ID #REQUIRED>
<!--
    【屬性的類型】
        CDATA:文本類型;
        Enumerated:枚舉類型;
        ID:ID類型,ID類型的屬性用來標識元素的唯一性,即元素的ID屬性值不能與其他元素的ID屬性值相同;
        IDREF:ID引用類型,用來指定另一個元素,與另一個元素建立關聯關系,IDREF類型的屬性值必須是另一個元素的ID。
    【屬性設置說明】
         #REQUIRED:說明屬性是必須的;
         #IMPLIED:說明屬性是可選的
         默認值:在不給出屬性值時,使用默認值
-->

XML文件-student.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE students SYSTEM "student.dtd">
<students>
	<student number="it_0001">
		<name>tom</name>
		<age>18</age>
		<sex>male</sex>
	</student>
	
</students>

3.3-Schema約束

引入

<!--1.填寫xml文檔的根元素-->
<!--2.引入xsi前綴.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"-->
<!--3.引入xsd文件命名空間.  xsi:schemaLocation="http://www.aa.cn/xml  student.xsd"-->
<!--4.為每一個xsd約束聲明一個前綴,作為標識  xmlns="http://www.aa.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">

演示

xsd文件:student

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        targetNamespace="http://www.ss.aa/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"/>
            <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="it_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 

xml文件: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.aa.cn/xml  student.xsd"
	4.為每一個xsd約束聲明一個前綴,作為標識  xmlns="http://www.aa.cn/xml" 
	
	
 -->
 <students   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 			 xmlns="http://www.aa.cn/xml" 
 		   xsi:schemaLocation="http://www.aa.cn/xml  student.xsd"
 		    >
 	<student number="it_0001">
 		<name>tom</name>
 		<age>18</age>
 		<sex>male</sex>
 	</student>
		 
 </students>

第四章:XML解析

4.1-概述

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

操作xml文檔

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

此篇文章主要學習如何讀取文檔中的數據

解析xml的方式

  1. DOM:將標記語言文檔一次性加載進內存,在內存中形成一顆dom樹。
    • 優點:操作方便,可以對文檔進行CRUD的所有操作
    • 缺點:占內存
  2. SAX:逐行讀取,基於事件驅動的。
    • 優點:不占內存。
    • 缺點:只能讀取,不能增刪改。

XML常見解析器

  1. JAXP:sun公司提供的解析器,支持dom和sax兩種思想。
  2. DOM4J:一款非常優秀的解析器。
  3. Jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某個URL地址、HTML文本內容。它提供了一套非常省力的API,可通過DOM,CSS以及類似於jQuery的操作方法來取出和操作數據。
  4. PULL:Android操作系統內置的解析器,sax方式的。

此篇文章主要學習Jsoup

4.2-Jsoup解析XML

介紹

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

使用步驟

  1. 導入jar包:jsoup-1.11.2.jar
  2. 獲取Document對象
  3. 獲取對應的標簽Element對象
  4. 獲取數據

jar包下載

鏈接:https://pan.baidu.com/s/1Mc0i7r9-sTrAJ-eeO4N5vw
提取碼:169v

快速入門

student.xml文件在模塊src目錄下

package it.leilei.jsoupDemo;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;

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

public class Test01 {
  public static void main(String[] args) throws IOException {
    // 獲取xml文件路徑
    String path = Test01.class.getClassLoader().getResource("student.xml").getPath();
    // 解析並獲取xml文件的document對象
    Document document = Jsoup.parse(new File(path),"utf-8");
    // 根據標簽名獲取元素
    Elements elements = document.getElementsByTag("name");
    System.out.println(elements.get(0).text()); // 張三
  }
}

Jsoup對象的使用

Jsoup:工具類,可以解析html或xml文檔,返回Document。

parse方法:解析html或xml文檔,返回Document。

  1. parse(File in, String charsetName):解析xml或html文件的。
  2. parse(String html):解析xml或html字符串。
  3. parse(URL url, int timeoutMillis):通過網絡路徑獲取指定的html或xml的文檔對象

Document對象的使用

Document:文檔對象。代表內存中的dom樹。

獲取Element對象的方法

  1. getElementById(String id):根據id屬性值獲取唯一的element對象
  2. getElementsByTag(String tagName):根據標簽名稱獲取元素對象集合
  3. getElementsByAttribute(String key):根據屬性名稱獲取元素對象集合
  4. getElementsByAttributeValue(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合

Elements對象的使用

元素Element對象的集合。可以當做 ArrayList<Element>來使用

Element對象的使用

獲取子元素對象的方法

  1. getElementById(String id):根據id屬性值獲取唯一的element對象
  2. getElementsByTag(String tagName):根據標簽名稱獲取元素對象集合
  3. getElementsByAttribute(String key):根據屬性名稱獲取元素對象集合
  4. getElementsByAttributeValue(String key, String value):根據對應的屬性名和屬性值獲取元素對象集合

獲取屬性值的方法

  1. String attr(String key):根據屬性名稱獲取屬性值

獲取文本內容的方法:

  1. String text():獲取文本內容。
  2. String html():獲取標簽體的所有內容(包括字標簽的字符串內容)

Node結點對象:是Document和Element的父類

Jsoup快速查詢元素的方式:selector方法

使用的方法:Elements select(String cssQuery)

語法:參考文檔Selector類中定義的語法,文檔在上述jar包下載中

Jsoup快速查詢元素的方式:XPath

XPath即為XML路徑語言,它是一種用來確定XML(標准通用標記語言的子集)文檔中某部分位置的語言。

使用Jsoup的Xpath需要額外導入jar包JsoupXpath-0.3.2.jar

查詢w3cshool參考手冊,使用xpath的語法完成查詢。

代碼演示

package it.leilei.jsoupDemo;

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;

public class Test02 {
  public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
    //1.獲取student.xml的path
    String path = Test02.class.getClassLoader().getResource("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> jxNodes2 = jxDocument.selN("//student/name");
    for (JXNode jxNode : jxNodes2) {
      System.out.println(jxNode);
    }

    System.out.println("--------------------");

    //4.3查詢student標簽下帶有id屬性的name標簽
    List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
    for (JXNode jxNode : jxNodes3) {
      System.out.println(jxNode);
    }
    System.out.println("--------------------");
    //4.4查詢student標簽下帶有id屬性的name標簽 並且id屬性值為it

    List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='it']");
    for (JXNode jxNode : jxNodes4) {
      System.out.println(jxNode);
    }
  }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM