成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

XML基礎(chǔ)知識(shí)歸納

Warren / 2525人閱讀

摘要:它提供了一套非常省力的,可通過,以及類似于的操作方法來取出和操作數(shù)據(jù)。

XML:可擴(kuò)展標(biāo)記型語言
隨著json等一些技術(shù)的普及,似乎xml的路子越來越窄,雖然xml的一些功能被其他的一些技術(shù)代替,但是學(xué)習(xí)xml還是非常有必要,如果用xml存儲(chǔ)一些大量數(shù)據(jù),還是有一定優(yōu)勢(shì)的,就算你不管這些,但是現(xiàn)有的很多框架以及技術(shù)的配置文件都存在于xml中,最起碼你得對(duì)它的結(jié)構(gòu)以及一些基本用法有一定了解
(一) 基本概述 (1) 概念

XML:Extensible Markup Language:可擴(kuò)展標(biāo)記型語言

標(biāo)記型:使用標(biāo)簽來操作,html就是一種常見的標(biāo)記型語言

可擴(kuò)展:可以自定義標(biāo)簽,甚至可以用中文寫標(biāo)簽 Eg: <張三><張三>

(2) 用途

xml 主要用來存儲(chǔ)數(shù)據(jù),體現(xiàn)在作配置文件,或者充當(dāng)小型數(shù)據(jù)庫,在網(wǎng)絡(luò)中傳輸數(shù)據(jù)

A:配置文件:例如配置mysql數(shù)據(jù)庫

前面我們常常書寫 一個(gè) jdbc.properties文件來做配置文件,好處呢就是如果想修改數(shù)據(jù)庫的信息,不需要修改源代碼,只要修改配置文件就可以了,而xml也可以作為配置文件來使用

url=jdbc:mysql://localhost:3306/db1
user=root
password=root99
driver=com.mysql.jdbc.Driver



    
        com.mysql.jdbc.Driver
        jdbc:mysql://localhost:3306/db1
        root
        root99

B:充當(dāng)小型數(shù)據(jù)庫

我們可以在xml中存儲(chǔ)一些數(shù)據(jù),讓它充當(dāng)一個(gè)小型的數(shù)據(jù)庫


 
     
        001  
        zhangsan  
        20 
      
     
        002  
        lisi  
        30 
      

C:傳輸數(shù)據(jù)

在網(wǎng)絡(luò)編程中,我們或多或少接觸過,例如如何實(shí)現(xiàn)一個(gè)簡(jiǎn)單的聊天室,基本原理是這樣的,一個(gè)服務(wù)器端,多個(gè)客戶端,當(dāng)客戶端1發(fā)送數(shù)據(jù)后,服務(wù)器端接收到數(shù)據(jù),并且對(duì)數(shù)據(jù)進(jìn)行一定的審核(是否有非法敏感字)以及格式的處理,再將數(shù)據(jù)發(fā)送到每一個(gè)客戶端中

剛開始的時(shí)候,我們一般選擇使用字符串直接傳遞內(nèi)容,但是卻不是很利于程序的后期維護(hù),而使用xml就能對(duì)后期程序的維護(hù)更加友好



    賬號(hào)1
    賬號(hào)2
    發(fā)送的信息
    ip地址
(二) xml語法

xml文檔的后綴名為 .xml

(1) 文檔聲明

創(chuàng)建一個(gè)xm文件后,第一步就是 必須要有 一個(gè)文檔聲明(寫了文檔聲明之后,表寫xml文件的內(nèi)容)

version : xml版本,必須寫

encoding:xml編碼 常見編碼: GBK、UTF-8、ISO8859-1(不包含中文)

保存時(shí)編碼和設(shè)置打開時(shí)候的編碼需要一致,否則會(huì)出現(xiàn)亂碼

standalone:是否需要依賴其他文件 yes/no

(2) 標(biāo)簽的定義

注意事項(xiàng)

有始有終:

合理嵌套:

空格和換行均當(dāng)做內(nèi)容來解析,所以可能我們需要注意一些縮進(jìn)的問題

名稱規(guī)則

xml 代碼區(qū)分大小寫

名稱不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開始

不能以 xml、XML、Xml等開頭

不能包含空格和冒號(hào)

(3) 屬性的定義

一個(gè)標(biāo)簽上可有多個(gè)屬性

屬性名稱和值之間使用 = 連接,屬性值用引號(hào)包起來(單引號(hào)和雙引號(hào)都可以)

(4) 注釋

注釋不能嵌套,并且不能放到第一行,第一行必須方式文檔聲明

(5) 特殊字符

如果想在xml中輸入特殊字符,需要對(duì)字符進(jìn)行轉(zhuǎn)義,因?yàn)?< 等會(huì)被當(dāng)做標(biāo)簽

字符 轉(zhuǎn)義字符 描述
& &
< < 小于號(hào)
> > 大于號(hào)
" " 雙引號(hào)
" " 單引號(hào)

若多個(gè)字符都需要轉(zhuǎn)義,則可以將這些內(nèi)容存放到CDATA里面

(七) PI指令 (處理指令)

可以在xml設(shè)置樣式

(三) xml約束
為什么需要用到約束呢?比如我們現(xiàn)在定義一個(gè) student.xml文件,我們想要在其中保存關(guān)于學(xué)生的信息,例如id,name,age,但是如果隨便寫入一個(gè)標(biāo)簽 例如 <你好> 從語法的角度上雖然是符合規(guī)范的,但是這顯然與我們想要存儲(chǔ)的東西沒有任何關(guān)系,所以我們需要通過xml約束技術(shù),約束xml中只能出現(xiàn)的元素

分類

DTD:一種相對(duì)簡(jiǎn)單的約束技術(shù)

Schema:一種相對(duì)復(fù)雜的約束技術(shù),看懂即可

DTD約束 (1) dtd的引入方式(三種)

A:使用內(nèi)部的dtd文件,即將約束規(guī)則定義在xml文檔中


    
    
]>

B:引入外部的dtd文件


C:使用外部的dtd文件(網(wǎng)絡(luò)上的dtd文件)



例如使用 struts2框架 使用配置文件 所使用 外部的dtd文件

(2) 使用dtd定義元素

A:簡(jiǎn)單元素(沒有子元素)

ELEMENT name (#PCDATA)>
    (#PCDATA): 約束name是字符串類型
    EMPTY : 元素為空(沒有內(nèi)容)
        - 
    ANY:任意

B:復(fù)雜元素



    子元素只能出現(xiàn)一次



* :一次多或多次
?:零次或一次
* :零次或多次


    表示元素出現(xiàn)的順序 


    表示元素只能出現(xiàn)其中的任意一個(gè)
(2) 使用dtd定義屬性



    CDATA: 字符串



表示只能在一定的范圍內(nèi)出現(xiàn)值,但是只能每次出現(xiàn)其中的一個(gè),紅綠燈效果






#REQUIRED:屬性必須存在
#IMPLIED:屬性可有可無
#FIXED: 表示一個(gè)固定值 #FIXED "AAA"
    屬性的值必須是設(shè)置的這個(gè)固定值
        

直接值
    不寫屬性,使用直接值
    寫了屬性,使用設(shè)置那個(gè)值
        
Schema約束

schema 符合 xml 的語法,一個(gè) xml 中可以有多個(gè) schema ,多個(gè) schema 使用名稱空間區(qū)分(類似于java包名)dtd 里面有PCDATA類型,但是在 schema 里面可以支持更多的數(shù)據(jù)類型

后綴名:xsd

引入:
填寫xml文檔的根元素

引入xsi前綴.  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    表示xml文件是一個(gè)約束文件
    
引入xsd文件命名空間.  xsi:schemaLocation="http://www.bwh.cn/xml  student.xsd"
    使用一個(gè)使用schema約束文件,直接通過這個(gè)地址引入約束文件
      通常使用一個(gè)url地址防止重名
      
為每一個(gè)xsd約束聲明一個(gè)前綴,作為標(biāo)識(shí)  xmlns="http://www.bwh.cn/xml" 

(1) 看xml中有多少個(gè)元素

(2) 看簡(jiǎn)單元素和復(fù)雜元素




    
                    


(3) 被約束文件里面引入約束文件



            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                -- 表示xml是一個(gè)被約束文件
            xmlns="http://www.bwh.cn/20151111"
                -- 是約束文檔里面 targetNamespace
            xsi:schemaLocation="http://www.bwh.cn/20151111 1.xsd">
                -- targetNamespace 空格  約束文檔的地址路徑

可以約束屬性

A: :表示元素的出現(xiàn)的順序
B: : 元素只能出現(xiàn)一次
C: :元素只能出現(xiàn)其中的一個(gè)
D: maxOccurs="unbounded": 表示元素的出現(xiàn)的次數(shù)
E: :表示任意元素

寫在復(fù)雜元素里面
寫在 之前

--

    - name: 屬性名稱
    - type:屬性類型 int stirng
    - use:屬性是否必須出現(xiàn) required
(四) xml的解析

很簡(jiǎn)單的理解解析:有一個(gè)xml,在其中讀取出需要的數(shù)據(jù)

(1) 解析方式 dom和sax

DOM:根據(jù)xml的層級(jí)結(jié)構(gòu)在內(nèi)存中分配一個(gè)樹形結(jié)構(gòu),把xml的標(biāo)簽,屬性和文本都封裝成對(duì)象,一次性加載進(jìn)內(nèi)存

優(yōu)點(diǎn):操作方便,很容易實(shí)現(xiàn)增刪改操作

缺點(diǎn):占內(nèi)存,有造成內(nèi)存溢出風(fēng)險(xiǎn)

SAX:采用事件驅(qū)動(dòng),邊讀邊解析,解析到某一個(gè)對(duì)象,返回對(duì)象名稱

優(yōu)點(diǎn):不占內(nèi)存

缺點(diǎn):只能讀取,不能實(shí)現(xiàn)增刪改操作

(2) 解析器

想要解析xml,我們必須了解解析器,不同的公司和組織,提供了針對(duì)dom和sax方式的解析器,通過api方式提供 (今天著重講解兩種比較常用的)

jaxp:sun公司所提供針對(duì)dom和sax的解析器,效率略低

dim4j:非常優(yōu)秀的解析器,在實(shí)際開發(fā)中比較常用

jdom:jdom組織所提供的針對(duì)dom和sax解析器

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

Pull:Android操作系統(tǒng)內(nèi)置的解析器,sax方式的

(3) 使用 dom4 操作 xml

注意:下面的所有java代碼中,由于我的代碼寫在Module中,所以路徑加了名字,若直接創(chuàng)建的是項(xiàng)目,只寫src/s1.xml即可



    
        zhangsan
        20
    
    
        lisi
        30
    

※ 使用dom4j實(shí)現(xiàn)查詢xml操作

(一)查詢所有name元素里面的值

package cn.ideal.xml.dom4j;

/*
   1、創(chuàng)建解析器
   2、得到document
   3、得到根節(jié)點(diǎn)  getRootElement() 返回Element
   4、得到所有的p1標(biāo)簽
      * elements("p1") 返回list集合
      * 遍歷list得到每一個(gè)p1
   5、得到name
      * 在p1下面執(zhí)行 element("name")方法 返回Element
   6、得到name里面的值
      * getText方法得到值
*/

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

import java.util.List;

public class TestDom4j1 {
    //查詢xml中所有name元素的值
    public static void main(String[] args) throws DocumentException {
        //創(chuàng)建解析器
        SAXReader saxReader = new SAXReader();
        //得到document
        Document document = saxReader.read("code-04_xml/src/s1.xml");
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到stu
        List list = rootElement.elements("stu");

        //遍歷list
        for (Element element : list) {
            //element是每一個(gè)元素
            //得到name里面的值
            Element name1 = element.element("name");
            //得到name里面的值
            String s = name1.getText();
            System.out.println(s);
        }
    }
}
//運(yùn)行結(jié)果
zhangsan
lisi

(二)查詢第一個(gè)name元素的值

package cn.ideal.xml.dom4j;

/*
    1、創(chuàng)建解析器
    2、得到document
    3、得到根節(jié)點(diǎn)
    4、得到第一個(gè)stu元素
        element("stu")方法 返回Element
    5、得到p1下面的name元素
        element("name")方法 返回Element
    6、得到name元素里面的值
        getText方法
 */

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

public class TestDom4j2 {
    public static void main(String[] args) throws DocumentException {
        //創(chuàng)建解析器
        SAXReader saxReader = new SAXReader();
        //得到document對(duì)象
        Document document = saxReader.read("code-04_xml/src/s1.xml");
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到第一個(gè)stu元素
        Element stu = rootElement.element("stu");
        //得到stu下面的name元素
        Element name1 = stu.element("name");
        //得到name的值
        String s1 = name1.getText();
        System.out.println(s1);
    }
}

//運(yùn)行結(jié)果
zhangsan

(三)獲取第二個(gè)name元素的值

package cn.ideal.xml.dom4j;

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

import java.util.List;

/*
    1、創(chuàng)建解析器
    2、得到document
    3、得到根節(jié)點(diǎn)
    4、得到所有的stu
        返回 list集合
    5、遍歷得到第二個(gè)stu
        使用list下標(biāo)得到 get方法,集合的下標(biāo)從 0 開始,想要得到第二個(gè)值,下標(biāo)寫 1
    6、得到第二個(gè)p1下面的name
        element("name")方法 返回Element
    7、得到name的值
        getText方法
 */
public class TestDom4j3 {
    public static void main(String[] args) throws DocumentException {
        //創(chuàng)建解析器
        SAXReader saxReader = new SAXReader();
        //得到document
        Document document = saxReader.read("code-04_xml/src/s1.xml");
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到所有stu
        List list = rootElement.elements("stu");
        //得到第二個(gè)stu
        Element stu2 = list.get(1);
        //得到stu下的name
        Element name2 = stu2.element("name");
        //得到name里面的值
        String s2 = name2.getText();
        System.out.println(s2);
    }
}

※ 使用dom4j實(shí)現(xiàn)添加操作

(一)在第一個(gè)p1標(biāo)簽?zāi)┪蔡砑右粋€(gè)元素 male

package cn.ideal.xml.dom4j;

import org.dom4j.Document;

import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileOutputStream;


/*
    1、創(chuàng)建解析器
    2、得到document
    3、得到根節(jié)點(diǎn)

    4、獲取到第一個(gè)p1
        使用element方法
    5、在p1下面添加元素
        在p1上面直接使用 addElement("標(biāo)簽名稱")方法 返回一個(gè)Element

    6、在添加完成之后的元素下面添加文本
       在sex上直接使用 setText("文本內(nèi)容")方法
    7、回寫xml
        格式化 OutputFormat,使用 createPrettyPrint方法,表示一個(gè)漂亮的格式
        使用類XMLWriter 直接new 這個(gè)類 ,傳遞兩個(gè)參數(shù)
        第一個(gè)參數(shù)是xml文件路徑 new FileOutputStream("路徑")
        第二個(gè)參數(shù)是格式化類的值
*/
public class TestDom4j4 {
    public static void main(String[] args) throws Exception {
        //創(chuàng)建解析器
        SAXReader saxReader = new SAXReader();
        //得到document
        Document document = saxReader.read("code-04_xml/src/s1.xml");
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到第一個(gè)stu元素
        Element stu = rootElement.element("stu");
        //在stu下面直接添加元素
        Element sex1 = stu.addElement("sex");
        //在sex下面添加文本
        sex1.setText("male");

        //回寫xml
        OutputFormat prettyPrint = OutputFormat.createPrettyPrint();//有縮進(jìn)效果
        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("code-04_xml/src/s1.xml"), prettyPrint);
        xmlWriter.write(document);
    }
}

寫一個(gè)工具類,簡(jiǎn)化操作

封裝方法的操作,可以省略創(chuàng)建解析器 得到document 以及回寫xml的方法,把傳遞的文件路徑,封裝成一個(gè)常量

好處:可以提高開發(fā)速度,可以提交代碼可維護(hù)性

比如想要修改文件路徑(名稱),這個(gè)時(shí)候只需要修改常量的值就可以了,其他代碼不需要做任何改變

package cn.ideal.xml.utils;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.FileOutputStream;
import java.io.IOException;

public class Dom4jUtils {
    public static final String PATH = "code-04_xml/src/s1.xml";

    //返回document
    public static Document getDocument(String path) {
        //創(chuàng)建解析器
        SAXReader saxReader = new SAXReader();
        //得到document
        try {
            Document document = saxReader.read(path);
            return document;
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        return null;
    }

    //回寫xml的方法
    public static void xmlWriters(String path, Document document) {
        try {
            OutputFormat prettyPrint = OutputFormat.createPrettyPrint();//有縮進(jìn)效果
            XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path), prettyPrint);
            xmlWriter.write(document);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

我們上面執(zhí)行添加操作的代碼就可以簡(jiǎn)化為

package cn.ideal.xml.dom4j;

import cn.ideal.xml.utils.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Element;


public class TestDom4j5 {
    public static void main(String[] args) throws Exception {

        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到第一個(gè)stu元素
        Element stu = rootElement.element("stu");
        //在stu下面直接添加元素
        Element sex1 = stu.addElement("sex");
        //在sex下面添加文本
        sex1.setText("male");

        //回寫xml
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
    }
}

(二)使用dom4j實(shí)現(xiàn)在特定位置添加元素

在第一個(gè)stu下面的name標(biāo)簽前添加 001

package cn.ideal.xml.dom4j;

import cn.ideal.xml.utils.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;

import java.util.List;

/*
    1、創(chuàng)建解析器
    2、得到document
    3、得到根節(jié)點(diǎn)
    4、獲取到第一個(gè)p1

    5、獲取p1下面的所有的元素
           ** elements()方法 返回 list集合

        ** 使用list里面的方法,在特定位置添加元素
       ** 首先創(chuàng)建元素 在元素下面創(chuàng)建文本
              - 使用DocumentHelper類方法createElement創(chuàng)建標(biāo)簽
              - 把文本添加到標(biāo)簽下面 使用 setText("文本內(nèi)容")方法

         ** list集合里面的 add(int index, E element)
           - 第一個(gè)參數(shù)是 位置 下標(biāo),從0開始
           - 第二個(gè)參數(shù)是 要添加的元素
      6、回寫xml
*/
public class TestDom4j6 {
    //在第一個(gè)stu下面的name標(biāo)簽前添加001
    public static void main(String[] args) {
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到第一個(gè)stu元素
        Element stu = rootElement.element("stu");
        //獲取stu下全部元素
        List list = stu.elements();
        //創(chuàng)建元素
        Element id = DocumentHelper.createElement("id");
        //在id下面創(chuàng)建文本
        id.setText("001");
        //在特定位置添加
        list.add(0, id);

        Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
    }
}

(三)使用dom4j實(shí)現(xiàn)修改節(jié)點(diǎn)的操作

修改第一個(gè)p1下面的age元素的值為18

package cn.ideal.xml.dom4j;
/*
    1、得到document
       2、得到根節(jié)點(diǎn),然后再得到第一個(gè)p1元素
       3、得到第一個(gè)p1下面的age
      element("")方法
       4、修改值是 30
       使用setText("文本內(nèi)容")方法
       5、回寫xml
*/

import cn.ideal.xml.utils.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Element;

public class TestDom4j7 {
    public static void main(String[] args) {
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到第一個(gè)stu元素
        Element stu = rootElement.element("stu");
        //得到第一個(gè)stu下面的age
        Element age = stu.element("age");
        age.setText("18");
        //回寫xml
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
    }
}

※ 使用dom4j實(shí)現(xiàn)刪除節(jié)點(diǎn)的操作

package cn.ideal.xml.dom4j;

import cn.ideal.xml.utils.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Element;

public class TestDom4j8 {
    public static void main(String[] args) {
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到第一個(gè)stu元素
        Element stu = rootElement.element("stu");
        //得到第一個(gè)stu下面的age
        Element id = stu.element("id");

        stu.remove(id);
        //回寫xml
        Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document);
    }
}

使用dom4j獲取屬性的操作

package cn.ideal.xml.dom4j;

import cn.ideal.xml.utils.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Element;

public class TestDom4j9 {
    public static void main(String[] args) {
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //得到根節(jié)點(diǎn)
        Element rootElement = document.getRootElement();
        //得到第一個(gè)stu元素
        Element stu = rootElement.element("stu");
        //得到stu里面的屬性值
        String value = stu.attributeValue("id1");
        System.out.println(value);
    }
}
(4) 使用dom4j支持xpath具體操作
XPath即為XML路徑語言(XML Path Language),它是一種用來確定XML文檔中某部分位置的語言

默認(rèn)的情況下,dom4j不支持xpath

如果想用,需要引入支持xpath的jar包,使用 jaxen-1.1-beta-6.jar

第一種形式
    /AAA/CCC/BBB: 表示一層一層的,AAA下面CCC下面的BBB
第二種形式
    //BBB: 表示和這個(gè)名稱相同,表示只要名稱是BBB,都得到
第三種形式
    /*: 所有元素
第四種形式
    BBB[1]: 表示第一個(gè)BBB元素
    BBB[last()]:表示最后一個(gè)BBB元素
第五種形式
    //BBB[@id]: 表示只要BBB元素上面有id屬性,都得到
第六種形式
    //BBB[@id="b1"] 表示元素名稱是BBB,在BBB上面有id屬性,并且id的屬性值是b1

dom4j里面提供了兩個(gè)方法,用來支持xpath

//獲取多個(gè)節(jié)點(diǎn)
selectNodes("xpath表達(dá)式")

//獲取一個(gè)節(jié)點(diǎn)
selectSingleNode("xpath表達(dá)式")

(一)使用xpath實(shí)現(xiàn):查詢xml中所有name元素的值

package cn.ideal.xml.dom4j.xpath;

import cn.ideal.xml.utils.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Node;

import java.util.List;

public class TestDom4jXpath1 {
    //查詢xml中所有name元素的值
    public static void main(String[] args) {
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        //獲取所有name元素
        List list = document.selectNodes("http://name");
        //遍歷list集合
        for (Node node : list) {
            //node是每一個(gè)name元素
            //得到name元素里面的值
            String s = node.getText();
            System.out.println(s);
        }
    }
}

(二)使用xpath實(shí)現(xiàn):獲取第一個(gè)stu下面的name的值

package cn.ideal.xml.dom4j.xpath;

import cn.ideal.xml.utils.Dom4jUtils;
import org.dom4j.Document;
import org.dom4j.Node;

public class TestDom4jXpath2 {
    public static void main(String[] args) {
        //得到document
        Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH);
        Node name1 = document.selectSingleNode("http://stu[@id1="love"]/name");
        //得到name里面的值
        String s1 = name1.getText();
        System.out.println(s1);
    }
}
(4) 使用 Jsoup 操作 xml
package cn.ideal.xml.jsoup;

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

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

public class JsoupDemo1 {
    public static void main(String[] args) throws IOException {
        //獲取Documnet對(duì)象
        //通過類加載器,獲取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //解析xml文檔,加載文檔進(jìn)內(nèi)存,獲取dom樹 --> Document
        Document document = Jsoup.parse(new File(path), "utf-8");
        //獲取元素對(duì)象 Element
        Elements elements = document.getElementsByTag("name");

        //獲取第一個(gè)name
        Element element = elements.get(0);
        //獲取數(shù)據(jù)
        String name = element.text();
        System.out.println(name);
    }
}

對(duì)上述常用對(duì)象的解釋

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

parse:

//解析xml或html文件
parse (File in, String charsetName)

//解析xml或html字符串
parse (String html)

//通過網(wǎng)絡(luò)路徑獲取指定的html或xml
parse (URL url, int timeoutMillis)

2. Document:文檔對(duì)象:代表內(nèi)存中的dom樹

A:獲取Element對(duì)象

//根據(jù)id屬性值獲取唯一的element對(duì)象
getElementById (String id)

//根據(jù)標(biāo)簽名稱獲取元素對(duì)象集合
getElementsByTag (String tagName)

//根據(jù)屬性名稱獲取元素對(duì)象集合
getElementsByAttribute (String key)

//根據(jù)對(duì)應(yīng)的屬性名和屬性值獲取元素對(duì)象集合
getElementsByAttributeValue (String key, String value)

3. Elements:元素Element對(duì)象的集合??梢越频恼J(rèn)為 ArrayList

A:獲取Element對(duì)象,同2中

B:獲取屬性值

String attr(String key):根據(jù)屬性名稱獲取屬性值

C:獲取文本內(nèi)容

//獲取文本內(nèi)容
String text()

//獲取標(biāo)簽體的所有內(nèi)容
String html()

兩種更加快捷的查詢方式

selector:選擇器

Elements select(String cssQuery)
//具體語法,看文檔格式


    
        zhangsan
        18
    
    
        lisi
        30
    
package cn.ideal.xml.jsoup;

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

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

public class SelectorDemo {
    public static void main(String[] args) throws IOException {
        //獲取Documnet對(duì)象
        //通過類加載器,獲取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //解析xml文檔,加載文檔進(jìn)內(nèi)存,獲取dom樹 --> Document
        Document document = Jsoup.parse(new File(path), "utf-8");

        //查詢name標(biāo)簽
        Elements elements1 = document.select("name");
        System.out.println(elements1);

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

        //查詢id值為 stu_001
        Elements elements2 = document.select("#ideal");
        System.out.println(elements2);

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

        Elements elements3 = document.select("stu[number="stu_001"]");
        System.out.println(elements3);

    }
}

//運(yùn)行結(jié)果

 zhangsan


 lisi

--------------

 zhangsan

--------------
 
 
  zhangsan
  
 
  18
  

XPath

package cn.ideal.xml.jsoup;

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.util.List;

public class XpathDemo {
    public static void main(String[] args) throws Exception {
//獲取Documnet對(duì)象
        //通過類加載器,獲取student.xml的path
        String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
        //解析xml文檔,加載文檔進(jìn)內(nèi)存,獲取dom樹 --> Document
        Document document = Jsoup.parse(new File(path), "utf-8");

        //創(chuàng)建JXDocument對(duì)象
        JXDocument jxDocument = new JXDocument(document);

        //結(jié)合xpath語法查詢
        List jxNodes = jxDocument.selN("http://stu");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);
        }
    }
}

//運(yùn)行結(jié)果
 
 
  zhangsan
  
 
  18
  

 
 
  lisi
  
 
  30
  
//查詢stu標(biāo)簽下的name標(biāo)簽
List jxNodes = jxDocument.selN("http://student/name");

//查詢stu標(biāo)簽下帶有id屬性且屬性值ideal的name標(biāo)簽
List jxNodes = jxDocument.selN("http://stu/name[@id="ideal"]");
結(jié)尾:

如果內(nèi)容中有什么不足,或者錯(cuò)誤的地方,歡迎大家給我留言提出意見, 蟹蟹大家 !^_^

如果能幫到你的話,那就來關(guān)注我吧?。ㄏ盗形恼戮鶗?huì)在公眾號(hào)第一時(shí)間更新)

在這里的我們素不相識(shí),卻都在為了自己的夢(mèng)而努力 ?

一個(gè)堅(jiān)持推送原創(chuàng)Java技術(shù)的公眾號(hào):理想二旬不止

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/110397.html

相關(guān)文章

  • 給Java新手的一些建議——Java知識(shí)點(diǎn)歸納(Java基礎(chǔ)部分)

    摘要:中很多特性或者說知識(shí)點(diǎn)都是和面向?qū)ο缶幊谈拍钕嚓P(guān)的。在多線程中內(nèi)容有很多,只是簡(jiǎn)單說明一下中初步使用多線程需要掌握的知識(shí)點(diǎn),以后有機(jī)會(huì)單獨(dú)再詳細(xì)介紹一些高級(jí)特性的使用場(chǎng)景。   寫這篇文章的目的是想總結(jié)一下自己這么多年來使用java的一些心得體會(huì),主要是和一些java基礎(chǔ)知識(shí)點(diǎn)相關(guān)的,所以也希望能分享給剛剛?cè)腴T的Java程序員和打算入Java開發(fā)這個(gè)行當(dāng)?shù)臏?zhǔn)新手們,希望可以給大家一些經(jīng)...

    lykops 評(píng)論0 收藏0
  • 社區(qū)投稿 | DBLE rule.xml 配置解析

    摘要:舉例注,分片方式如果配置分片區(qū)間足夠?qū)挼脑捯彩强梢援?dāng)做連續(xù)分片的。如果都匹配不上,則落在默認(rèn)節(jié)點(diǎn)分片理論上在這個(gè)例子中是不可能匹配不上的關(guān)于每一種拆分算法的詳細(xì)介紹請(qǐng)參加官方文檔介紹。 文章來源:愛可生云數(shù)據(jù)庫作者:余朝飛 DBLE項(xiàng)目介紹 DBLE官方網(wǎng)站:https://opensource.actionsky.com可以詳細(xì)了解DBLE的背景和應(yīng)用場(chǎng)景,本文不涉及到的細(xì)節(jié)都可在官...

    lauren_liuling 評(píng)論0 收藏0
  • 【全棧之路】JAVA基礎(chǔ)課程七_(dá)AJAX原理剖析(20190617v1.0)

    摘要:借鑒圖片僅用于學(xué)習(xí)分享,請(qǐng)尊重原創(chuàng)作者,勿用于商用。這其中最關(guān)鍵的一步就是從服務(wù)器獲得請(qǐng)求數(shù)據(jù)。基本步驟創(chuàng)建對(duì)象也就是創(chuàng)建一個(gè)異步調(diào)用對(duì)象。創(chuàng)建一個(gè)新的請(qǐng)求并指定該請(qǐng)求的方法及驗(yàn)證信息。設(shè)置響應(yīng)請(qǐng)求狀態(tài)變化的函數(shù)。使用和實(shí)現(xiàn)局部刷新。 歡迎進(jìn)入JAVA基礎(chǔ)課程 博客地址:https://blog.csdn.net/houjiyu...本系列文章將主要針對(duì)JAVA一些基礎(chǔ)知識(shí)點(diǎn)進(jìn)行講解...

    biaoxiaoduan 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<