3/30day22_XML_XML約束

day22_XML_XML約束

思維導(dǎo)圖

復(fù)習(xí)

1.知識(shí)點(diǎn)差不多都理解,不知道以后干啥用的,太多了消化不良
                    給框架用的!!     慢慢消化!!!
反射:
    1.如何獲取Class對(duì)象
        類名.class
        對(duì)象名.getClass();
        Class.forName("包名.類名")
    2.如何通過反射獲取構(gòu)造方法,并使用構(gòu)造方法
        Class對(duì)象.getConstructor(參數(shù)類型.class,..);
        Class對(duì)象.getConstructors();

        Class對(duì)象.getDeclaredConstructor(參數(shù)類型.class,..);
        Class對(duì)象.getDeclaredConstructors();

        Constructor對(duì)象.setAccessible(true);
        Constructor對(duì)象.newInstance(參數(shù));
    3.如果通過反射獲取成員方法,并使用成員方法
        Class對(duì)象.getMethod(String name,參數(shù)類型.class,..);
        Class對(duì)象.getMethods(); //獲取"public"修飾的所有方法(包括父類繼承的)

        Class對(duì)象.getDeclaredMethod(String name,參數(shù)類型.class,..);
        Class對(duì)象.getDeclaredMethods();//獲取"任意修飾"的所有方法(不包括父類繼承的)

        Method對(duì)象.setAccessible(true);
        Method對(duì)象.invoke(對(duì)象名,參數(shù));
        
注解:
    1.定義注解
        public @interface 注解名{
            數(shù)據(jù)類型 屬性名();
            數(shù)據(jù)類型 屬性名() default 默認(rèn)值;
        }
    2.使用注解
        默認(rèn)情況下,注解可以用在包上,類上,方法上(構(gòu)造方法/普通方法),變量上(成員變量/局部變量)
        使用格式:
            @注解名(必須給沒有默認(rèn)值的屬性賦值,有默認(rèn)值可以賦值也可以不賦值)
    3.特殊的屬性:value
        a.如果注解只有一個(gè)屬性,并且叫做value,那么使用該注解時(shí),可以省略value的名字,直接寫value的值
        b.如果除了value之外還有其他屬性,必須其他屬性有默認(rèn)值,且不重寫賦值,
                                        那么使用該注解時(shí),可以省略value的名字,直接寫value的值
    4.元注解(了解)
    5.注解的解析(了解)   

今日內(nèi)容

  • XML
  • XML約束

XML的學(xué)習(xí)

XML概念

XML的介紹

  • XML 指可擴(kuò)展標(biāo)記語言(EXtensible Markup Language)

  • XML 是一種標(biāo)記語言,很類似 HTML,HTML文件也是XML文檔 <標(biāo)簽名></標(biāo)簽名>

  • XML 的設(shè)計(jì)宗旨是傳輸數(shù)據(jù),而非顯示數(shù)據(jù)

  • XML 標(biāo)簽沒有被預(yù)定義。您需要自行定義標(biāo)簽

  • XML 被設(shè)計(jì)為具有自我描述性(就是易于閱讀)紊选。

  • XML 是 W3C 的推薦標(biāo)準(zhǔn)

XML的版本

W3C在1988年2月發(fā)布1.0版本,2004年2月又發(fā)布1.1版本躲惰,但因?yàn)?.1版本不能向下兼容1.0版本励七,所以1.1沒有人用智袭。同時(shí),在2004年2月W3C又發(fā)布了1.0版本的第三版掠抬。我們要學(xué)習(xí)的還是1.0版本吼野。

XML與HTML的主要差異

  • XML 不是 HTML 的替代
  • XML 和 HTML 為不同的目的而設(shè)計(jì)。
  • XML 被設(shè)計(jì)為傳輸和存儲(chǔ)數(shù)據(jù)(現(xiàn)在用的json更多)两波,其焦點(diǎn)是數(shù)據(jù)的內(nèi)容瞳步。
  • HTML 被設(shè)計(jì)用來顯示數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的外觀腰奋。
  • HTML 旨在顯示信息单起,而 XML 旨在傳輸信息。

XML的入門小案例

<?xml version="1.0" encoding="UTF-8"?>
<person id="110">
    <age>18</age>       <!--年齡-->
    <name>張三</name>   <!--姓名-->
    <sex/>              <!--性別-->
</person>

XML的作用

  • XML在企業(yè)開發(fā)中主要有兩種應(yīng)用場(chǎng)景:
    • XML可以存儲(chǔ)數(shù)據(jù) , 作為數(shù)據(jù)交換的載體(使用XML格式進(jìn)行數(shù)據(jù)的傳輸)劣坊。(現(xiàn)在使用的json更多)
    • XML也可以作為配置文件嘀倒,例如后面框架階段我們學(xué)習(xí)的Spring框架的配置(applicationContext.xml)都是通過XML進(jìn)行配置的(企業(yè)開發(fā)中經(jīng)常使用的)

XML的語法

XML的組成元素

XML文件中常見的組成元素有:文檔聲明、元素局冰、屬性测蘑、注釋、轉(zhuǎn)義字符康二、字符區(qū)碳胳。

  • 文檔聲明: 作用是說明這是個(gè)XML文件

    • 必須寫在XML文件的0行0列(左上角)
    • 固定格式: <?xml version="1.0" encoding="UTF-8" ?> 表示為版本, 編碼
  • 元素/標(biāo)簽

    • 格式:

      <標(biāo)簽名> </標(biāo)簽名> 或者當(dāng)沒有內(nèi)容時(shí)可以寫成 <標(biāo)簽名/>

    • 標(biāo)簽有三部分組成: 由開始標(biāo)簽、元素體沫勿、結(jié)束標(biāo)簽組成挨约。

    • 元素體:元素體可以是元素,也可以是文本藕帜,例如: <person><name>張三</name></person>

    • 空元素:空元素只有標(biāo)簽烫罩,而沒有結(jié)束標(biāo)簽,但元素必須自己閉合洽故,例如: <sex/>

    • 元素/標(biāo)簽的命名要求

      • 區(qū)分大小寫
      • 不能使用空格贝攒,不能使用冒號(hào)等特殊符號(hào)
      • 不建議以XML、xml时甚、Xml開頭
    • 格式化良好的XML文檔隘弊,有且僅有一個(gè)根元素。根元素是指最外層標(biāo)簽

  • 屬性

    <person id="110">

    • 屬性是元素的一部分荒适,它必須出現(xiàn)在元素的開始標(biāo)簽中
    • 屬性的定義格式:屬性名=“屬性值”梨熙,其中屬性值必須使用單引或雙引號(hào)括起來
    • 一個(gè)元素可以有0~N個(gè)屬性,但一個(gè)元素中不能出現(xiàn)同名屬性
    • 屬性名不能使用空格 , 不要使用冒號(hào)等特殊字符刀诬,且必須以字母開頭
  • 注釋

    ``

  • 轉(zhuǎn)義字符

    需要用的一些特殊字符時(shí), 可能直接寫上這些字符會(huì)成為XML語法的一部分, 所以使用轉(zhuǎn)義字符

    字符 預(yù)定義的轉(zhuǎn)義字符 說明
    < &lt; 小于
    > &gt; 大于
    " &quot; 雙引號(hào)
    ' &apos; 單引號(hào)
    & &amp; 和號(hào)

    如下需要把 < 改為 &lt;

    <message>if salary < 1000 then</message>

    <message>if salary &lt; 1000 then</message>

  • 字符區(qū)

    • 需要大量轉(zhuǎn)義字符時(shí), 使用格式
    <![CDATA[
        文本數(shù)據(jù)
    ]]>
    
    1. CDATA 指的是不應(yīng)由 XML 解析器進(jìn)行解析的文本數(shù)據(jù)(Unparsed Character Data)
    2. CDATA 部分由 "" 結(jié)束咽扇;
    • 注意
      CDATA 部分不能包含字符串 "]]>"。也不允許嵌套的 CDATA 部分。
      標(biāo)記 CDATA 部分結(jié)尾的 "]]>" 不能包含空格或折行质欲。

XML文件的約束

在XML技術(shù)里树埠,可以編寫一個(gè)文檔來約束一個(gè)XML文檔的書寫規(guī)范,這稱之為XML約束嘶伟。

常見的xml約束:DTD怎憋、Schema

DTD約束

  • 概念:

    DTD約束: 成為文檔類型定義, 規(guī)定我們?cè)诰帉慩ML時(shí)具體的標(biāo)簽,子標(biāo)簽, 屬性等

  • DTD約束簡(jiǎn)單入門

    1. 復(fù)制編寫好的dtd文件到指定文件夾下,
    2. 新建需要編寫的XML文件
    3. 將dtd文件中引用規(guī)則寫入新建的XML文件中 如<!DOCTYPE 書架 SYSTEM "bookshelf.dtd">
    4. 根據(jù)dtd文件規(guī)則編寫xml內(nèi)容
  • 在企業(yè)實(shí)際開發(fā)中,我們很少自己編寫DTD約束文檔九昧,通常情況下通過框架提供的DTD約束文檔編寫對(duì)應(yīng)的XML文檔绊袋。所以這一知識(shí)點(diǎn)的要求是可以根據(jù)DTD約束文檔內(nèi)容編寫XML文檔。

  • DTD的語法

    • DTD的引入

      1. 內(nèi)部DTD(把DTD內(nèi)容直接寫在XML里面. 這種方法只對(duì)當(dāng)前XML文件有效)

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE 根元素 [...//具體語法]><!--內(nèi)部DTD-->
        <根元素>
        </根元素>
        
      2. 外部DTD-本地(把DTD文檔放在本地系統(tǒng)上, 內(nèi)部人自己使用)

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE 根元素 SYSTEM "bookshelf.dtd"><!--外部本地DTD-->
        <根元素>
        </根元素>
        
      3. 外部DTD-公共(把DTD文檔放在網(wǎng)絡(luò)上, 一般框架使用較多)

        <?xml version="1.0" encoding="UTF-8"?>
        <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
        "http://java.sun.com/dtd/web-app_2_3.dtd">
        <web-app>
        </web-app>
        
    • DTD中的數(shù)量詞

      數(shù)量詞符號(hào) 含義
      * 表示元素出現(xiàn)0到多個(gè)
      + 表示元素出現(xiàn)至少1個(gè)
      ? 表示元素可以是0或1個(gè)
      , 表示元素需要按照順序顯示
      | 表示元素需要選擇其中的某一個(gè)
    • DTD中的元素聲明

      • 語法

        <!ELEMENT 標(biāo)簽名字 標(biāo)簽類型>

      • 標(biāo)簽類型有三種

        (#PCDATA) 被解釋的字符串?dāng)?shù)據(jù)

        EMPTY 即空元素铸鹰,例如


        ANY 即任意類型-

        <!ELEMENT 書名 (#PCDATA)>     <!--"書名"元素體為字符串?dāng)?shù)據(jù)-->
        <!ELEMENT 作者 (#PCDATA)>     <!--"作者"元素體為字符串?dāng)?shù)據(jù)-->
        <!ELEMENT 售價(jià) (#PCDATA)>     <!--"售價(jià)"元素體為字符串?dāng)?shù)據(jù)-->
        <!ELEMENT 出版日期 ANY>        <!--"出版日期"元素體為任意類型-->
        <!ELEMENT 版本號(hào) EMPTY>        <!--"版本號(hào)"元素體為空元素-->
        
  • DTD中的屬性聲明

    <!ATTLIST 書                           <!--設(shè)置"書"元素的的屬性列表-->
            id ID #REQUIRED                <!--"id"屬性值為必須有-->
            編號(hào) CDATA #IMPLIED             <!--"編號(hào)"屬性可有可無-->
            出版社 (清華|北大|傳智播客) "傳智播客"<!--"出版社"屬性值是枚舉值癌别,默認(rèn)為“傳智播客”-->
            type CDATA #FIXED "IT"          <!--"type"屬性為文本字符串并且固定值為"IT"-->
    >
    

schema約束

  • 概念

    Schema 語言也可作為 XSD(XML Schema De?nition)。
    Schema 比DTD強(qiáng)大掉奄,是DTD代替者规个。
    Schema 本身也是XML文檔,Schema文檔擴(kuò)展名為xsd姓建,而不是xml。
    Schema 功能更強(qiáng)大缤苫,數(shù)據(jù)類型約束更完善速兔。

  • schema使用

    1. 復(fù)制schema約束文件中指定的代碼到需要編寫的xml文件中.

    2. 我們復(fù)制過來的是根標(biāo)簽的開始標(biāo)簽, 需要補(bǔ)充結(jié)束標(biāo)簽

    3. 根據(jù)約束編寫xml文件

  • schema中的 名稱空間

    相當(dāng)于導(dǎo)包一樣, 指定是哪個(gè)文件中的標(biāo)簽名. 名稱空間就是用來處理元素和屬性的名稱沖突問題,與Java中的包是同一用途活玲。如果每個(gè)元素和屬性都有自己的名稱空間涣狗,那么就不會(huì)出現(xiàn)名字沖突問題,就像是每個(gè)類都有自己所在的包一樣舒憾,那么類名就不會(huì)出現(xiàn)沖突镀钓。如xsd文件中的<xs:element name='書名'

  • schema 學(xué)習(xí)的要求

    schema功能比dtd強(qiáng)大,但是編寫要比DTD復(fù)雜镀迂,同樣以后我們?cè)谄髽I(yè)開發(fā)中也很少會(huì)自己編寫schema文件,需要學(xué)會(huì)框架提供的xsd約束去編寫xml.


XML解析

XML解析概述

就是將XML文件中保存的數(shù)據(jù)讀取出來

解析方式, 解析器,解析開發(fā)包

解析方式

  • DOM解析: 要求解析器把整個(gè)XML文檔裝載到內(nèi)存丁溅,并解析成一個(gè)Document對(duì)象

    • 優(yōu)點(diǎn):元素與元素之間保留結(jié)構(gòu)關(guān)系,故可以進(jìn)行增刪改查操作探遵。
    • 缺點(diǎn):XML文檔過大窟赏,可能出現(xiàn)內(nèi)存溢出
  • SAX:是一種速度更快,更有效的方法箱季。它逐行掃描文檔涯穷,一邊掃描一邊解析。并以事件驅(qū)動(dòng)的方式進(jìn)行具體解析藏雏,每執(zhí)行一行拷况,都觸發(fā)對(duì)應(yīng)的事件。

    • 優(yōu)點(diǎn):處理速度快,可以處理大文件
    • 缺點(diǎn):只能讀赚瘦,逐行后將釋放資源粟誓,解析操作繁瑣。
  • PULL:Android內(nèi)置的XML解析方式蚤告,類似SAX努酸。

解析器

就是根據(jù)不同的解析方式提供具體實(shí)現(xiàn)。

解析開發(fā)包

對(duì)解析器的繁瑣細(xì)節(jié) 進(jìn)行了封裝. 方便開發(fā)人員根據(jù)API解析xml文件

  • 常見的解析開發(fā)包
    • JAXP:sun公司提供支持DOM和SAX開發(fā)包
    • Dom4j:比較簡(jiǎn)單的的解析開發(fā)包(常用)
    • JDom:與Dom4j類似
    • Jsoup:功能強(qiáng)大DOM方式的XML解析開發(fā)包杜恰,尤其對(duì)HTML解析更加方便(項(xiàng)目中講解)

Dom4J的基本使用

  • Dom4J 的基本原理

    XML DOM 和 HTML DOM一樣获诈,XML DOM 將整個(gè)XML文檔加載到內(nèi)存,生成一個(gè)DOM樹心褐,并獲得一個(gè)Document對(duì)象舔涎,通過Document對(duì)象就可以對(duì)DOM進(jìn)行操作。以下面books.xml文檔為例逗爹。

<?xml version="1.0" encoding="UTF-8"?>
<books>
    <book id="0001">
        <name>JavaWeb開發(fā)教程</name>
        <author>張孝祥</author>
        <sale>100.00元</sale>
    </book>
    <book id="0002">
        <name>三國(guó)演義</name>
        <author>羅貫中</author>
        <sale>100.00元</sale>
    </book>
</books>
  • 結(jié)構(gòu)模型

DOM中的核心概念就是節(jié)點(diǎn)亡嫌,在XML文檔中的元素、屬性掘而、文本挟冠,在DOM中都是節(jié)點(diǎn)!所有的節(jié)點(diǎn)都封裝到了Document對(duì)象中袍睡。

  • 引入dom4j的jar包

    1. 在模塊下創(chuàng)建一個(gè)lib文件夾(必須叫l(wèi)ib). 把第三方下的 dom4j 的jar包放入lib文件夾內(nèi)

    2. 將jar包加載到模塊依賴中

  • Dom4J的API

    • 核心類: SAXReader

      new SAXReader()構(gòu)造器

      Document read(String url)加載執(zhí)行xml文檔

    • Doucument對(duì)象的API

      Element getRootElement()獲得根元素

    • Element對(duì)象的API

      • List elements([String ele] ) 獲得指定名稱的所有子元素知染。可以不指定名稱(中括號(hào)內(nèi)可以不寫)
      • Element element([String ele])獲得指定名稱第一個(gè)子元素斑胜】氐可以不指定名稱
      • String getName() 獲得當(dāng)前元素的元素名
      • String attributeValue(String attrName) 獲得指定屬性名的屬性值
      • String elementText(Sting ele)獲得指定名稱子元素的文本值
      • String getText()獲得當(dāng)前元素的文本內(nèi)容
  • Dom4J的代碼演示

    首先將資料下的常用xml中"books.xml"放入項(xiàng)目目錄下

    xml文件如下

    <?xml version="1.0" encoding="UTF-8"?>
    <books>
        <book id="0001">
            <name>JavaWeb開發(fā)教程</name>
            <author>張孝祥</author>
            <sale>100.00元</sale>
        </book>
        <book id="0002">
            <name>三國(guó)演義</name>
            <author>羅貫中</author>
            <sale>100.00元</sale>
        </book>
    </books>
    

    java中解析xml文件如下

    public class Demo {
        public static void main(String[] args) throws DocumentException {
            SAXReader reader = new SAXReader();
            Document document = reader.read(Demo.class.getResourceAsStream("/books.xml
            //獲取根元素 books
            Element elemRoot = document.getRootElement();
     
            //獲取根元素的所有子元素 book
            List<Element>list = elemRoot.elements();
            //遍歷集合 獲取每一個(gè)book
            for(Element element : list){
                //獲取book的id屬性
                String id =element.attributeValue("id");
                System.out.println("id : "+ id);
     
                //獲取book下的所有子元素 name,author,sale
                List<Element>listElem = element.elements();
                //遍歷集合 獲取每一個(gè)子元素
                for(Element elem : listElem){
                    //元素名
                    String name = elem.getName();
                    //文本值
                    String text = elem.getText();
                    System.out.println("--- " + name + " : " + text);
                }
            }
        }
    }
    

Dmo4J結(jié)合XPath解析XML

什么是XPath

XPath是XML 的路徑表達(dá)式, 可以快速從n層標(biāo)簽中選出需要的標(biāo)簽.(一般都是寫好的, 要會(huì)使用)

XPath使用步驟

  • 具體步驟
  1. 導(dǎo)入jar包(dom4j和jaxen-1.1-beta-6.jar)
  2. 通過dom4j的SaxReader獲取Document對(duì)象
  3. 利用Xpath提供的api,結(jié)合xpaht的語法完成選取XML文檔元素節(jié)點(diǎn)進(jìn)行解析操作。
  • 和XPath相關(guān)的Doucument的常用API
    • List selectNodes("XPath路徑表達(dá)式")獲取符合路徑表達(dá)式的所有元素集合
    • Element selectSingleNode("XPath路徑表達(dá)式")獲取符合路徑表達(dá)式的唯一元素

XPath路徑表達(dá)式的語法(了解就行)

  • 絕對(duì)路徑表達(dá)式方式

    格式: String xpath="/元素/子元素/子子元素...";

    絕對(duì)路徑是以“/”開頭止潘,一級(jí)一級(jí)描述標(biāo)簽的層級(jí)路徑就是絕對(duì)路徑掺炭,這里注意不可以跨層級(jí)
    絕對(duì)路徑是從根元素開始寫路徑的,這里開頭的“/”代表HTML文檔根元素凭戴,所以在絕對(duì)路徑中不可以寫根元素路徑

  • 相對(duì)路徑表達(dá)式

    格式: String xpath1="子元素/子子元素...";//獲取相對(duì)當(dāng)前路徑元素里面的子元素的選取

  • 全文搜索路徑表達(dá)式方式(常用的)

    格式: String xpath1="http://子元素//子子元素";

    一個(gè)“/”符號(hào)涧狮,代表逐級(jí)寫路徑
    2個(gè)“//”符號(hào),不用逐級(jí)寫路徑簇宽,可以直接選取到對(duì)應(yīng)的節(jié)點(diǎn)勋篓,是全文搜索匹配的不需要按照逐層級(jí)

  • 謂語(條件篩選)

    格式:

    //元素[test() =value] 表示獲取元素的文本值為value的節(jié)點(diǎn)

    String xpath1="http://元素[@attr1=value]";//獲取元素屬性attr1=value的元素

    String xpath2="http://元素[@attr1>value]/@attr1"http://獲取元素屬性attr1>value的d的所有attr1的值

    String xpath3="http://元素[@attr1=value]/text()";//獲取符合條件元素體的自有文本數(shù)據(jù)

    String xpath4="http://元素[@attr1=value]/html()";//獲取符合條件元素體的自有html代碼數(shù)據(jù)。

    String xpath3="http://元素[@attr1=value]/allText()";//獲取符合條件元素體的所有文本數(shù)據(jù)(包含子元素里面的文本)

Dom4J結(jié)合XPaht的代碼演示

public class DemoXpath {
    public static void main(String[] args) throws Exception {
        SAXReader reader = new SAXReader();
        Document document = reader.read(Demo.class.getResourceAsStream("/books.xml"));
        //獲取所有的book元素
        List<Element> list = document.selectNodes("http://book");
        for (Element ele: list) {
            System.out.println(ele.attributeValue("id"));
        }
 
       //獲取id為0002的指定book元素的子標(biāo)簽name的內(nèi)容
        Element ele = (Element)document.selectSingleNode("http://book[@id='0002']/name");
        System.out.println(ele.getText());
    }
}

今日總結(jié)

學(xué)習(xí)目標(biāo)

1.能夠說出XML的作用
    是一種標(biāo)記語言魏割,主要用于傳輸數(shù)據(jù)譬嚣。
    規(guī)范數(shù)據(jù)格式,使數(shù)據(jù)具有結(jié)構(gòu)性,便于讀寫钞它。
    多應(yīng)用于框架的配置文件拜银。
    
2.了解XML的組成元素
    文檔聲明殊鞭、元素、屬性尼桶、注釋操灿、轉(zhuǎn)義字符、字符區(qū)  
    
    文檔聲明
        <?xml version="1.0" encoding="utf-8" ?>
        1.文檔聲明必須從文檔的0行0列位置開始泵督;
        2.version:指定XML文檔版本,必備屬性趾盐,一般都是1.0
        3.encoding:指定當(dāng)前文檔的編碼,可選屬性小腊,默認(rèn)值是utf-8
              
    元素   
        <元素名></元素名>
        <元素名/>
        1.元素名區(qū)分大小寫救鲤。
        2.普通元素的結(jié)構(gòu)由開始標(biāo)簽、元素體秩冈、結(jié)束標(biāo)簽組成本缠。
        3.空元素可以沒有結(jié)束標(biāo)簽
        4.元素體可以嵌套文本或其他元素。
            <元素名>張三</元素名>
            <元素名1>
                <元素名2></元素名2>
                <元素名3></元素名3>
            </元素名1>     
        
    屬性
        <元素名 屬性名="屬性值"></元素名>
        1.屬性是元素的一部分入问,它必須出現(xiàn)在元素的開始標(biāo)簽內(nèi)丹锹。
        2.屬性的定義格式:屬性名=“屬性值”,其中屬性值必須使用單引或雙引號(hào)括起來芬失。
        3.一個(gè)元素可以有多個(gè)屬性楣黍,但屬性不能同名。
        4.屬性名必須以字母開頭棱烂。

    注釋
        <!--注釋內(nèi)容-->
        注釋不能嵌套使用锡凝。
    
    轉(zhuǎn)義字符
        為了避免文檔結(jié)構(gòu)沖突,一些特殊符號(hào)需要使用轉(zhuǎn)義字符表示垢啼。
        字符   轉(zhuǎn)義字符   說明
         <     &lt;     小于
         >     &gt;     大于
         "     &quot;   雙引號(hào)
         '     &apos;   單引號(hào)
         &     &amp;    和號(hào)

    
    字符區(qū)
        <![CDATA[
            文本數(shù)據(jù)
        ]]>
        CDATA中的文本會(huì)原樣輸出,便于直觀閱讀數(shù)據(jù)张肾。
        CDATA結(jié)構(gòu)不能嵌套芭析。
          
             
3.能夠說出有哪些XML約束技術(shù)
    DTD約束
    schema約束

    
4.能夠說出解析XML文檔DOM方式原理
    DOM解析原理:
        解析器會(huì)把整個(gè)XML加載到內(nèi)存,并解析成一個(gè)文檔樹的結(jié)構(gòu)吞瞪,返回一個(gè)Document對(duì)象馁启。
        通過操作Document對(duì)象,就可以實(shí)現(xiàn)對(duì)XML文件的增刪改查芍秆。
        
    
5.能夠使用dom4j解析XML文檔
    使用前需要在項(xiàng)目或模塊下添加dom4j-1.6.1.jar的開發(fā)包惯疙。

    讀取XML,生成Document對(duì)象:
        SAXReader reader = new SAXReader(); 
        Doucument d = reader.read("xml文件地址") 
        
    獲取文檔根元素:        
        Element e = d.getRootElement(); 
    
    操作Element對(duì)象:
        List elements([String ele] ) 獲取當(dāng)前元素的所有直接子元素妖啥∶沟撸可以不指定名稱
        Element element(String name) 獲得指定名稱第一個(gè)子元素。
        String attributeValue(String attrName) 獲得指定屬性名的屬性值
        String elementText(String ele) 獲得指定名稱子元素的文本值
        String getName() 獲得當(dāng)前元素的元素名
        String getText() 獲得當(dāng)前元素的文本內(nèi)容


6.能夠使用xpath解析XML或HTML文檔
    需要導(dǎo)入的包:
        dom4j-1.6.1.jar
        jaxen-1.1-beta-6.jar
        
    XPath使用路徑表達(dá)式來選取文檔中的元素或?qū)傩浴?        絕對(duì)路徑 :/根元素/子元素/子子元素...
        相對(duì)路徑 :子元素/子子元素..
                 ./子元素/子子元素..      
        全文搜索 : //子元素//子子元素  
        條件過濾: //元素[@屬性名=屬性值]

    配合表達(dá)式查詢的常用方法:
        獲取多個(gè)元素的集合:List selectNodes("xpath表達(dá)式")
        獲取單個(gè)元素: Note selectSingleNode("xpath表達(dá)式")
    

綜合練習(xí)

根據(jù)要求荆虱,解析以下book.xml文檔

1. 找到id為002的書蒿偎,并輸出書名
2. 查詢 category=計(jì)算機(jī) 的圖書的數(shù)量朽们,并遍歷打印書名。
3. 查詢 name=紅樓夢(mèng) 的書對(duì)應(yīng)的類別诉位。(提示:獲取父類元素 getParent())骑脱。
4. 統(tǒng)計(jì)價(jià)格在50元以下的圖書數(shù)量。
5. 解析book.xml文檔苍糠,封裝到ArrayList<Book>集合中叁丧,再遍歷輸出集合的元素。

6. 修改作者為黑馬程序員的書本岳瞭,改作者為:傳智播客拥娄,
7. 將修改后的xml寫出到當(dāng)前模塊src目錄下,文件名為book_v2.xml

book.xml

<?xml version="1.0" encoding="utf-8" ?>
<bookstore>
    <book id="001" category="計(jì)算機(jī)">
        <name>Java基礎(chǔ)案例</name>
        <author>黑馬程序員</author>
        <price>49</price>
    </book>

    <book id="002" category="計(jì)算機(jī)">
        <name>MySQL數(shù)據(jù)庫原理</name>
        <author>黑馬程序員</author>
        <price>59</price>
    </book>

    <book id="003" category="計(jì)算機(jī)">
        <name>數(shù)據(jù)結(jié)構(gòu)與算法</name>
        <author>Allen</author>
        <price>66</price>
    </book>

    <book id="004" category="文學(xué)">
        <name>三國(guó)演義</name>
        <author>羅貫中</author>
        <price>39</price>
    </book>

    <book id="005" category="文學(xué)">
        <name>紅樓夢(mèng)</name>
        <author>曹雪芹</author>
        <price>39</price>
    </book>
</bookstore>

Book類

public class Book {
    private String id;
    private String category;
    private String name;
    private String author;
    private String price;

    public Book() {
    }

    public Book(String id, String category, String name, String author, String price) {
        this.id = id;
        this.category = category;
        this.name = name;
        this.author = author;
        this.price = price;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getPrice() {
        return price;
    }

    public void setPrice(String price) {
        this.price = price;
    }

    @Override
    public String toString() {
        return "Book{" +
                "id='" + id + '\'' +
                ", category='" + category + '\'' +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price='" + price + '\'' +
                '}';
    }
}

解析代碼

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import java.io.File;
import java.io.FileWriter;
import java.util.ArrayList;
import java.util.List;

public class BookDemo {
    public static void main(String[] args) throws Exception {
        //讀取xml文件寝优,返回DOM對(duì)象
        SAXReader reader = new SAXReader();
        Document d = reader.read("day22/src/book.xml");

        //1. 找到id為002的書条舔,并輸出書名
        String name = d.selectSingleNode("http://book[@id='002']/name").getText();
        System.out.println(name);

        //2. 查詢 category=計(jì)算機(jī) 的圖書的數(shù)量,并遍歷打印書名乏矾。
        List<Element> list = d.selectNodes("http://book[@category='計(jì)算機(jī)']");
        System.out.println("數(shù)量為:"+list.size());
        list.forEach(e->{
            //String name2 = e.element("name").getText();
            String name2 = e.elementText("name");//獲取每一個(gè)name元素的文本
            System.out.println(name2);
        });

        //3. 查詢 name=紅樓夢(mèng) 的書對(duì)應(yīng)的類別孟抗。(提示:獲取父類元素 getParent())。
        //獲取元素<name>紅樓夢(mèng)</name>
        Element e = (Element)d.selectSingleNode("http://book/name[text()='紅樓夢(mèng)']");
        //獲取<name>元素的父標(biāo)簽<book>
        Element parent = e.getParent();
        //獲取屬性值
        String category = parent.attributeValue("category");
        System.out.println("紅樓夢(mèng)的類別是:"+category);


        //4. 統(tǒng)計(jì)價(jià)格在50元以下的圖書數(shù)量钻心。
        //獲取所有book的price元素凄硼,再獲取元素中的文本,即價(jià)格
        List<Element> priceList = d.selectNodes("http://book/price");
        int count = 0;
        for(Element e2 : priceList){
            String p = e2.getText();
            Integer price = Integer.valueOf(p);
            if(price<=50){
                count++;
            }
        }
        System.out.println("價(jià)格在50元以下的圖書數(shù)量:"+count);


        //5. 解析book.xml文檔捷沸,封裝到ArrayList<Book>集合中摊沉,再遍歷輸出集合的元素。
        List<Book> bookList = new ArrayList<>();
        //獲取所有book元素的集合
        List<Element> eList = d.selectNodes("http://book");
        //遍歷每一個(gè)book元素
        eList.forEach(e3->{
            String id = e3.attributeValue("id");
            String cate = e3.attributeValue("category");
            String bookName = e3.elementText("name");//獲取e3元素的子元素name的文本
            String author = e3.elementText("author");
            String price = e3.elementText("price");
            //創(chuàng)建Book對(duì)象
            Book b = new Book(id,cate,bookName,author,price);
            //添加到集合里
            bookList.add(b);

        });
        //遍歷ArrayList<Book>集合
        bookList.forEach(System.out::println);

        //6. 修改作者為黑馬程序員的書本痒给,改作者為:傳智播客
        //   修改元素文本方法:setText("新內(nèi)容")
        //獲取所有<author>黑馬程序員</author>元素
        List<Element> listAut = d.selectNodes("http://book/author[text()='黑馬程序員']");
        listAut.forEach(eAut->{
            //修改作者
            eAut.setText("傳智播客");
        });
        

        //7.將修改后的xml寫出到當(dāng)前模塊src目錄下说墨,文件名為book_v2.xml
        FileWriter f = new FileWriter("day22/src/book_v2.xml");
        d.write(f);
        //刷出數(shù)據(jù)并關(guān)閉流
        f.flush();
        f.close();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市苍柏,隨后出現(xiàn)的幾起案子尼斧,更是在濱河造成了極大的恐慌,老刑警劉巖试吁,帶你破解...
    沈念sama閱讀 217,907評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棺棵,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡熄捍,警方通過查閱死者的電腦和手機(jī)烛恤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來余耽,“玉大人缚柏,你說我怎么就攤上這事”鎏恚” “怎么了船惨?”我有些...
    開封第一講書人閱讀 164,298評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵柜裸,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我粱锐,道長(zhǎng)疙挺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,586評(píng)論 1 293
  • 正文 為了忘掉前任怜浅,我火速辦了婚禮铐然,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘恶座。我一直安慰自己搀暑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,633評(píng)論 6 392
  • 文/花漫 我一把揭開白布跨琳。 她就那樣靜靜地躺著自点,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脉让。 梳的紋絲不亂的頭發(fā)上桂敛,一...
    開封第一講書人閱讀 51,488評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音溅潜,去河邊找鬼术唬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛滚澜,可吹牛的內(nèi)容都是我干的粗仓。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼设捐,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼借浊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起萝招,我...
    開封第一講書人閱讀 39,176評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤巴碗,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后即寒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,619評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡召噩,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,819評(píng)論 3 336
  • 正文 我和宋清朗相戀三年母赵,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片具滴。...
    茶點(diǎn)故事閱讀 39,932評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凹嘲,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出构韵,到底是詐尸還是另有隱情周蹭,我是刑警寧澤趋艘,帶...
    沈念sama閱讀 35,655評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站凶朗,受9級(jí)特大地震影響瓷胧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棚愤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,265評(píng)論 3 329
  • 文/蒙蒙 一搓萧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宛畦,春花似錦瘸洛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至踏施,卻和暖如春石蔗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背读规。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工抓督, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人束亏。 一個(gè)月前我還...
    沈念sama閱讀 48,095評(píng)論 3 370
  • 正文 我出身青樓铃在,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親碍遍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子定铜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,884評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容