溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

發(fā)布時間:2020-06-18 17:12:04 來源:網(wǎng)絡(luò) 閱讀:4676 作者:wyait 欄目:關(guān)系型數(shù)據(jù)庫

這輩子沒辦法做太多事情所以每一件都要做到精彩絕倫

People can't do too many things in my life,so everything will be wonderful   

 

本文檔參考資料w3cschool.CHM  API教程文檔免費下載地址http://down.51cto.com/data/2300287

XML技術(shù)

1.     什么是XML

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

XML 是一種標(biāo)記語言很類似 HTML

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

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

XML 被設(shè)計為具有自我描述性。

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

htmlxml的區(qū)別

html超文本標(biāo)記語言。它主要是用來封裝頁面上要顯示的數(shù)據(jù)最后通過瀏覽器來解析html文件然后把數(shù)據(jù)展示在瀏覽器上。同樣我們可以使用JSDOM技術(shù)對html文件進(jìn)行解析和操作。

xml可擴(kuò)展的標(biāo)記語言。它早期是為了代替html技術(shù)但是由于html書寫的網(wǎng)頁在全球占有率太高最后沒有成功。

后期我們開始使用xml文件作為軟件的配置文件或者數(shù)據(jù)的存儲文件以及傳輸數(shù)據(jù)的文件。

 

2.     XML作用

  • 存儲和傳輸復(fù)雜的關(guān)系模型數(shù)據(jù)

  • 在軟件系統(tǒng)中作為配置文件使用主要用途

為提高系統(tǒng)的靈活性它所啟動的模塊通常由其配置文件決定

例如一個軟件在啟動時它需要啟動、兩個模塊而A、這兩個模塊在啟動時又分別需要A1、A2B1、B2模塊的支持為了準(zhǔn)確描述這種關(guān)系此時使用文件最為合適不過。

3.     XML語法

一個XML文件分為如下幾部分內(nèi)容

文檔聲明

元素

屬性

注釋 

CDATA區(qū) 、特殊字符

處理指令processing instruction

3.1     文檔聲明

l  在編寫XML文檔時需要先使用文檔聲明聲明XML文檔的類型。也就是告訴其他解析軟件該文檔是個XML文檔。

l  最簡單的聲明語法

        <?xmlversion="1.0" ?>

l  encoding屬性說明文檔的字符編碼經(jīng)常使用的

        <?xmlversion="1.0" encoding="UTF-8" ?> 

l  standalone屬性說明文檔是否獨立

        <?xmlversion="1.0" encoding=" UTF-8"  standalone="yes" ?>

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

拖入瀏覽器解析

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

注意如果使用記事本編輯的話會解析錯誤中文亂碼問題。只是使用記事本編輯的時候會出現(xiàn)其原因如下

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

 

l  常見錯誤

1. <?xml version=1.0 ?> 屬性沒加引號

2. <?xml version=1.0” ?> 全角空格

3.編碼錯誤

 

3.2     元素element
  • XML元素指XML文件中出現(xiàn)的標(biāo)簽一個標(biāo)簽分為開始標(biāo)簽和結(jié)束標(biāo)簽一個標(biāo)簽有如下幾種書寫形式例如

包含標(biāo)簽體<a>wyait.blog.51cto.com/</a>

不含標(biāo)簽體的<a></a>,簡寫為<a/>

  • 一個標(biāo)簽中也可以嵌套若干子標(biāo)簽。但所有標(biāo)簽必須合理的嵌套絕對不允許交叉嵌套例如

                   <a>welcometo <b> wyait.blog.51cto.com/</a></b>

  • 格式良好的XML文檔必須有且僅有一個根標(biāo)簽其它標(biāo)簽都是這個根標(biāo)簽的子孫標(biāo)簽。

  • 對于XML標(biāo)簽中出現(xiàn)的所有空格和換行XML解析程序都會當(dāng)作標(biāo)簽內(nèi)容進(jìn)行處理。例如下面兩段內(nèi)容的意義是不一樣的。

第一段

<網(wǎng)址> wyait.blog.51cto.com</網(wǎng)址>

第二段

<網(wǎng)址>

         wyait.blog.51cto.com

</網(wǎng)址>

由于在XML中空格和換行都作為原始內(nèi)容被處理所以在編寫XML文件時使用換行和縮進(jìn)等方式來讓原文件中的內(nèi)容清晰可讀的“良好”書寫習(xí)慣可能要被迫改變。

  • 命名規(guī)范

一個XML元素可以包含字母、數(shù)字以及其它一些可見字符但必須遵守下面的一些規(guī)范

  • 區(qū)分大小寫例如<P><p>是兩個不同的標(biāo)記。

  • 不能以數(shù)字開頭

  • 不能包含空格

  • 名稱中間不能包含冒號: --- Schema約束沖突

  • 不建議"_"(下劃線)開頭

  •      屬性
  • 一個標(biāo)簽可以有多個屬性每個屬性都有它自己的名稱和取值例如

                   <inputtype=“text”>

  • 屬性值一定要用雙引號"或單引號'引起來

  • 定義屬性必須遵循與標(biāo)簽相同的命名規(guī)范

  • XML技術(shù)中標(biāo)簽屬性所代表的信息也可以被改成用子元素的形式來描述例如

                   <input><type>text</type></input>

3.4     注釋
  • Xml文件中的注釋采用“<!--注釋-->”格式。

注意

XML聲明之前不能有注釋

注釋不能嵌套例如

         <!--大段注釋

         ……

                   <!--局部注釋-->

         ……

         --> 

3.5     CDATA區(qū)
  • 在編寫XML文件時有些內(nèi)容可能不想讓解析引擎解析執(zhí)行而是當(dāng)作原始內(nèi)容處理。

  • 遇到此種情況可以把這些內(nèi)容放在CDATA區(qū)里對于CDATA區(qū)域內(nèi)的內(nèi)容XML解析程序不會處理而是直接原封不動的輸出。

語法<![CDATA[ 內(nèi)容 ]]>

         <![CDATA[

                   <wyait>

                            <br/>

                   </wyait >

         ]]>

<demo>

    <!--

        當(dāng)我們希望把一些文本原樣的顯示在瀏覽器中時

        可以使用xml中提供的cdata區(qū)域

       

        格式

            <![CDATA[需要原樣顯示的數(shù)據(jù)]]>

           

        由于CDATA區(qū)域書寫麻煩可以使用特殊字符

            &lt;   <

            &gt;   >

    -->

    <![CDATA[

        <h2>html表示的是標(biāo)題標(biāo)簽

        <br>html表示換行

    ]]>

   

    &lt;h2&gt;html表示的是標(biāo)題標(biāo)簽

   

</demo>

3.5.1       轉(zhuǎn)義字符

l 對于一些單個字符若想顯示其原始樣式也可以使用轉(zhuǎn)義的形式予以處理。

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

常見的XML轉(zhuǎn)義字符記錄如下:

         空格: <string name="out_bound_submit">出&#160;&#160;庫</string> 其中的&#160;就代表空格!解析的時候,空格還是空格!

       換行: <string name="hello_world">你好!\n世界!</string> 其中的\n就代表換行

       縮進(jìn): <string name="hello_world">你好!\t世界!</string> 其中的\t就代表按一次Tab鍵的幾個空格

            應(yīng)當(dāng)注意,由于系統(tǒng)定義的基本的縮進(jìn)的格數(shù)不同,有的代表4個半角字符,有的代表8個半角字符, 所以可能顯示時效果不同。

        如果在xml配置中使用了換行、空格、縮進(jìn)等,解析的時候會把換行、空格、縮進(jìn)解析為\n、 空格、\t等轉(zhuǎn)義字符!如下:

        XML技術(shù)-Schema約束-Dom4j-Xpath詳解

解析的時候:

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

代碼中會導(dǎo)致,本身配置的放行路徑,結(jié)果沒有放行!

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

3.6     處理指令processing instruction
  • 處理指令簡稱PI processinginstruction。處理指令用來指揮解析引擎如何解析XML文檔內(nèi)容。

 

  • 例如在XML文檔中可以使用xml-stylesheet指令通知XML解析引擎應(yīng)用css文件顯示xml文檔內(nèi)容。        <?xml-stylesheettype="text/css" href="1.css"?>

 

  • 處理指令必須以“<?”作為開頭以“?>”作為結(jié)尾XML聲明語句就是最常見的一種處理指令。

 

3.7     總結(jié)

l 所有XML 元素都須有關(guān)閉標(biāo)簽

l XML 標(biāo)簽對大小寫敏感

l XML 必須正確地嵌套順序

l XML 文檔必須有根元素(只有一個)

l XML 的屬性值須加引號

l 特殊字符必須轉(zhuǎn)義--- CDATA

l XML 中的空格、回車換行會解析時被保留

4.     XML約束

  • 什么是XML約束

XML技術(shù)里可以編寫一個文檔來約束一個XML文檔的書寫規(guī)范這稱之為XML約束。

  • 為什么需要XML約束

常用的約束技術(shù)

XML DTD

XML Schema XSD

4.1     DTD約束

DTD的快速入門

1、先創(chuàng)建一個xml文件

 XML技術(shù)-Schema約束-Dom4j-Xpath詳解

2、書寫一個DTD文件

dtd文件的擴(kuò)展名必須是dtd

xml中有多少個標(biāo)簽在dtd中就書寫多少個ELEMNT

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

3、在xml文件中導(dǎo)入DTD的約束

 XML技術(shù)-Schema約束-Dom4j-Xpath詳解

4.1.1       DTD約束語法

DTDxml文件的結(jié)合方式

  • 使用內(nèi)部DTD

可以把dtdxml書寫在同一個文件中

<!DOCTYPE 根標(biāo)簽名 [

dtd的約束

] >

XML文件使用 DOCTYPE 聲明語句來指明它所遵循的DTD文件DOCTYPE聲明語句有兩種形式

 當(dāng)引用的文件在本地時外部DTD采用如下方式

              <!DOCTYPE文檔根結(jié)點 SYSTEM "DTD文件的URL">

       例如 <!DOCTYPE books SYSTEM“book.dtd”>。xml文件中手寫一下。

l 當(dāng)引用的文件是一個公共的文件時公共DTD采用如下方式 

              <!DOCTYPE文檔根結(jié)點 PUBLIC "DTD名稱" "DTD文件的URL">

              例如<!DOCTYPE web-app PUBLIC

              "-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN"

              "http://java.sun.com/dtd/web-app_2_3.dtd">

4.1.2       DTD的元素ELEMENT定義

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

 

DTD中使用 ELEMENT 聲明當(dāng)前xml中可以出現(xiàn)的標(biāo)簽名稱 () 限制當(dāng)前這個標(biāo)簽中的文本或者子標(biāo)簽。

 XML技術(shù)-Schema約束-Dom4j-Xpath詳解

告訴我們  當(dāng)前的xml中可以有一個 books 標(biāo)簽在這個books標(biāo)簽下可以有一個或多個book子標(biāo)簽。

當(dāng)前括號中的這個標(biāo)簽可以出現(xiàn)一次或多次

當(dāng)前括號中的這個標(biāo)簽可以出現(xiàn)零次或一次

當(dāng)前括號中的這個標(biāo)簽可以出現(xiàn)零次或多次

 XML技術(shù)-Schema約束-Dom4j-Xpath詳解

括號中的逗號是在定義出現(xiàn)的子標(biāo)簽的順序。

 XML技術(shù)-Schema約束-Dom4j-Xpath詳解

當(dāng)前這個name標(biāo)簽中可以書寫文本

 

4.1.3       屬性ATTLIST定義

 XML技術(shù)-Schema約束-Dom4j-Xpath詳解

<!ATTLIST  標(biāo)簽名 

屬性名  屬性類型  屬性約束

屬性名  屬性類型  屬性約束

...

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

當(dāng)前book標(biāo)簽上有一個abc屬性這個屬性的值是一個文本但是這個必須是必須書寫的不能省略。

 

 

 

4.1.4       實體ENTITY定義

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

相關(guān)標(biāo)簽參考

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

4.2     Schema約束XSD約束
4.2.1       Schema概述

XML Schema是用一套預(yù)先規(guī)定的XML元素和屬性創(chuàng)建的這些元素和屬性定義了XML文檔的結(jié)構(gòu)和內(nèi)容模式。 XML Schema規(guī)定XML文檔實例的結(jié)構(gòu)和每個元素/屬性的數(shù)據(jù)類型

 

Schema相對于DTD的明顯好處是XMLSchema文檔本身也是XML文檔而不是像DTD一樣使用自成一體的語法

  • SchemaDTD區(qū)別

XMLSGML中繼承了DTD并用它來定義內(nèi)容的模型驗證和組織元素。同時它也有很多局限

    DTD不遵守XML語法

    DTD不可擴(kuò)展

    DTD不支持命名空間的應(yīng)用

    DTD沒有提供強大的數(shù)據(jù)類型支持只能表示很簡單的數(shù)據(jù)類型。

Schema完全克服了這些弱點使得基于Web的應(yīng)用系統(tǒng)交換XML數(shù)據(jù)更為容易。下面是它所展現(xiàn)的一些新特性

    Schema完全基于XML語法不需要再學(xué)習(xí)特殊的語法

    Schema能用處理XML文檔的工具處理而不需要特殊的工具

    Schema大大擴(kuò)充了數(shù)據(jù)類型支持booleans、numbers、dates and times、URIs、integers、decimal numbersreal numbers

    Schema支持原型也就是元素的繼承。如我們定義了一個聯(lián)系人數(shù)據(jù)類型然后可以根據(jù)它產(chǎn)生朋友聯(lián)系人客戶聯(lián)系兩種數(shù)據(jù)類型

    Schema支持屬性組。我們一般聲明一些公共屬性然后可以應(yīng)用于所有的元素屬性組允許把元素、屬性關(guān)系放于外部定義、組合

    開放性。原來的DTD只能有一個DTD應(yīng)用于一個XML文檔現(xiàn)在可以有多個Schema運用于一個XML文檔。

4.2.2       Schema基本概念
  • XML Schema 文件自身就是一個XML文件但它的擴(kuò)展名通常為.xsd

  • XML文件一樣一個XMLSchema文檔也必須有一個根結(jié)點但這個根結(jié)點的名稱為Schema

  • 應(yīng)用schema約束 開發(fā)xml 過程

W3C預(yù)先定義元素和屬性-àSchema文檔模式文檔約束文檔-àXML文檔實例文檔

 

  • 編寫了一個XMLSchema約束文檔后通常需要把這個文件中聲明的元素綁定到一個地址上這個URI地址叫namespace名稱空間以后XML文件就可以通過這個URI即名稱空間引用綁定指定名稱空間的元素

  • XML Schema文檔基本結(jié)構(gòu)

W3C XML schema規(guī)范中規(guī)定所有的Schema文檔都使用<schema>作為其根元素

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

<schema>元素可以包含一些屬性。一個XMLschema聲明看起來經(jīng)常以如下的形式出現(xiàn)

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

4.2.3       Schema快速入門

1、定義一個xml文件

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

 

2、書寫一個Schema文件

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

 

Schema文件中  必須以 schema作為 Schema文件的根標(biāo)簽。

 

xmlns="http://www.w3.org/2001/XMLSchema"

它的含義是表示當(dāng)前的Schema文件是被當(dāng)前指定的url名稱空間所約束。

 

targetNamespace="http://www.example.org/books"

給當(dāng)前這個Schema文件起名字當(dāng)需要被當(dāng)前這個Schema文件約束的xml文件需要通過當(dāng)前這個名字引入當(dāng)前Schema文件。

targetNamespace屬性對應(yīng)的屬性值可以是任意的內(nèi)容。比如targetNamespace="http://www.huyouta.com/books"

 

<schema xmlns="http://www.w3.org/2001/XMLSchema"

    targetNamespace="http://www.huyouta.com/books"

    elementFormDefault="qualified">

   

    <!--

        在Schema文件中書寫當(dāng)前xml中可以出現(xiàn)的標(biāo)簽 以及子標(biāo)簽 等信息

        1、先清楚xml中需要多少標(biāo)簽在Schema文件中就書寫多少個element標(biāo)簽

        2、element標(biāo)簽中的 name屬性 就是xml中 可以書寫的標(biāo)簽的名字

        3、在Schema中它把xml中可以出現(xiàn)的標(biāo)簽分成簡單標(biāo)簽和復(fù)雜標(biāo)簽

            簡單標(biāo)簽只有文本數(shù)據(jù)的標(biāo)簽成為簡單標(biāo)簽

            復(fù)雜標(biāo)簽如果標(biāo)簽上有屬性或者有子標(biāo)簽或者有屬性和子標(biāo)簽 或 屬性和文本的標(biāo)簽復(fù)雜標(biāo)簽

        4、針對復(fù)雜標(biāo)簽需要在當(dāng)前的標(biāo)簽中書寫子標(biāo)簽來限制當(dāng)前復(fù)雜標(biāo)簽中的其他內(nèi)容

            在element標(biāo)簽中需要使用complexType聲明當(dāng)前的element標(biāo)簽name屬性指定的是一個復(fù)雜標(biāo)簽

            如果是簡單標(biāo)簽可以使用simpleType

        5、對于復(fù)雜標(biāo)簽需要在 complexType中書寫sequence 標(biāo)簽表示子標(biāo)簽的順序

       

     -->  

    <elementname="books">  <!--books 是一個復(fù)雜標(biāo)簽 -->

        <complexType>

            <sequence>  <!-- 定義當(dāng)前books 標(biāo)簽中的子標(biāo)簽的順序-->

                <element name="book">

                    <complexType>  <!-- 聲明當(dāng)前的book 又是一個復(fù)雜標(biāo)簽-->

                        <sequence>

                            <!-- 在element 標(biāo)簽中的 type屬性來限制當(dāng)前單標(biāo)簽中文本的類型 -->

                            <elementname="name"  type="string"></element>

                            <elementname="author"type="string"></element>

                            <elementname="price"type="double"></element>

                        </sequence>

                    </complexType>

                </element>

            </sequence>

        </complexType>

    </element>

</schema>

 

3、在xml文件中引入Schema文件

 

xmlns="http://www.huyouta.com/books"

xml中引入 Schema文件的名稱

 

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

<books  xmlns="http://www.huyouta.com/books"

    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://www.huyouta.com/booksbooks.xsd"

> 

    <book>

        <name>葵花寶典</name>

        <author>班長</author>

        <price>9.9</price>

    </book>

</books>

4.2.4       名稱空間

聲明文檔空間

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"

                     targetNamespace="http://www.huyouta.com/books "

                     elementFormDefault="qualified"

                     attributeFormDefault="unqualified"

<xs:schema>

targetNamespace元素用于指定schema文檔中聲明的元素屬于哪個名稱空間。

elementFormDefault元素用于指定局部元素是否受到該schema指定targetNamespace所指定的名稱空間限定

attributeFormDefault元素用于指定局部屬性是否受到該schema指定targetNamespace所指定的名稱空間限定

總結(jié)

  • 在書寫Schema文件的時候需要在Schema文件中 使用 targetNamespace 屬性 給當(dāng)前的Schema文件起名。

  • targetNamespace屬性的值做為當(dāng)前 Schema文件的名稱空間。

  • xml文件中 需要 通過 xmlns 來引入不同名稱下的Schema文件。

  • 如果我們在同一個 xml文件中引入了多個Schema的名稱空間這時需要大家給這些名稱空間其別名。

  • 如果在xml文件使用了多個 xmlns引入多個名稱空間時需要在xmlns后面使用冒號給當(dāng)前的名稱空間起名。通過這個別區(qū)分到底當(dāng)前xml中的標(biāo)簽受限于具體哪個Schema文件。

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

5.     XML解析

  • DOM-Document Object Model-文檔對像模型。是w3c組織處理xml的一種方式。

特點

一次將所有數(shù)據(jù)全部加載到內(nèi)存中。

xml文檔中的每一個節(jié)點都當(dāng)成一個Node對像處理。包括元素、文本、屬性。

org.w3c.dom包中的Document,Element,Node

非常方便進(jìn)行修改。

已經(jīng)集成在了JDK中是Sunxml操作的標(biāo)準(zhǔn)。

缺點是當(dāng)文檔數(shù)據(jù)量很大時對內(nèi)存的占用很大。

Sax Sample Api for XML

在讀取數(shù)據(jù)時分析數(shù)據(jù)通過事件監(jiān)聽器來完成。

速度快但只適合讀取數(shù)據(jù)僅向前讀取不可后退。

  • xml可擴(kuò)展的標(biāo)記語言。

不管是html文件還是xml文件它們都是標(biāo)記型文檔都可以使用w3c組織制定的dom技術(shù)來解析。

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

dom解析技術(shù)是W3C組織制定的而所有的編程語言都對這個解析技術(shù)使用了自己語言的特點進(jìn)行實現(xiàn)。

 

Javadom技術(shù)解析標(biāo)記型文檔也做了實現(xiàn)

早期sun公司就制定的 dom 技術(shù)。而這個技術(shù)在頁面xml的時候需要把整個xml文件加載到內(nèi)存中可以根據(jù)getElementById、getElementsByName getElementsByTagName 等方法解析。

 

sun公司在JDK6版本對 dom解析技術(shù)進(jìn)行升級 SAX解析 Stax 解析

sun公司的解析統(tǒng)稱 JAXP。

5.1     解析XML的方式
  • JAXP(JavaApi for Xml Programming) sun公司的一套操作XMLAPI.

  • DOM解析-一次性的將數(shù)據(jù)全部裝入內(nèi)存。

  • SAX解析-邊讀取邊解析。

  • Dom4j(Document For Java)-第三方開源是從jdom分裂出來的解析技術(shù)。目前jdom已經(jīng)完全被dom4j替代。

  • jDom Dom4j的前身。

  • Dom4j在性能和速度上都比sun公司的要快而且支持Xpath快速查找目前像Spring,Hibernate這些大型的框架都是用的dom4j.

  • StAX JDK1.6新特性做為JAXP的新成員已經(jīng)集成在了JDK6當(dāng)中。

  •      Dom4j

Dom4j是一個開源、靈活的XML API。

目前很多開源框架如struts,hibernate都使用dom4j做為解析其xml的工具。

支持文檔的讀寫功能和Xpath快速查詢操作。

 

由于dom4j 它不是sun公司的技術(shù)而屬于第三方公司的技術(shù)我們需要使用dom4j 就需要到dom4j官網(wǎng)下載dom4jjar包。

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

dom4jjar包拷貝我們的項目中

在自己的項目中新建一個lib文件把dom4j jar包拷貝到其中

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

jar包添加到當(dāng)前的classpath路徑中

XML技術(shù)-Schema約束-Dom4j-Xpath詳解


 

 

5.2.1       獲取document對象

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

//注意以下類都來自于org.dom4j

//1、實例化解析器

SAXReader sax = newSAXReader();

//2、讀取xml文檔

Document doc =sax.read("./src/xml/a.xml");

//3、必須先獲取根節(jié)點

Element root =doc.getRootElement();

//4、獲取第一個人的姓名

String name =root.element("user").element("name").getText();

System.err.println(name);

 

5.2.2       獲取所有標(biāo)簽中的文本值

    //演示使用dom4j 獲取 xml中的標(biāo)簽中的數(shù)據(jù)

    publicstaticvoid getElement()throws Exception{

        SAXReader reader = new SAXReader();

        // 獲取dom

        Document dom = reader.read("users.xml");

       

        //獲取xml中的根標(biāo)簽

        Element root = dom.getRootElement();

       

        //獲取根標(biāo)簽下的所有子標(biāo)簽

        List<Element> list =root.elements();

       

        //遍歷集合獲取到每個 user標(biāo)簽

        for (Element e : list) {

           Elementname = e.element("name");

           Elementage = e.element("age");

           Elementsex = e.element("sex");

           System.out.println(name.getText() + ":" + age.getText()+":"+ sex.getText());

        }

    }

 

 

5.2.3       修改指定標(biāo)簽中的值

    //把最后一個user中的sex 修改為女

    publicstaticvoid UpdateElement()throws Exception{

        SAXReader reader = new SAXReader();

        // 獲取dom

        Document dom = reader.read("users.xml");

       

        //先獲取根標(biāo)簽

        Element root = dom.getRootElement();

        //獲取 users 下的所有user標(biāo)簽

        List<Element> list =root.elements();

        

        //獲取最后一個user標(biāo)簽

        Element lastUser =list.get(list.size()-1);

       

        Element sex = lastUser.element("sex");

       

        sex.setText("");

       

        //把內(nèi)存中修改后的dom樹重新寫到xml文件中

        //創(chuàng)建用于寫出數(shù)據(jù)的流對象

        //XMLWriter writer = new XMLWriter(newFileOutputStream("users.xml"));

       

        //創(chuàng)建一個格式器

        OutputFormat format = OutputFormat.createPrettyPrint();

        //設(shè)置編碼表

        format.setEncoding("gbk");

       

        XMLWriter writer = new XMLWriter(new FileWriter("users.xml") ,format );

        //寫出數(shù)據(jù)

        writer.write(dom);

        //關(guān)流

        writer.close();

       

    }

 

 

5.2.4       刪除標(biāo)簽

 

    // 刪除

    publicstaticvoid deleteElement() throws Exception {

        SAXReader reader = new SAXReader();

        // 獲取dom

        Document dom = reader.read("users.xml");

 

        // 刪除最后一個user標(biāo)簽

 

        // 先獲取根標(biāo)簽

        Element root = dom.getRootElement();

        // 獲取 users 下的所有user標(biāo)簽

        List<Element> list = root.elements();

 

        // 獲取最后一個user標(biāo)簽

        Element lastUser = list.get(list.size() -1);

 

        root.remove(lastUser);

 

        XMLWriter writer = new XMLWriter(newFileOutputStream("users.xml"));

        writer.write(dom);

        // 關(guān)流

        writer.close();

 

    }

 

 

5.2.5       增加標(biāo)簽

 

    // 創(chuàng)建一個新的dom寫到文件

    publicstaticvoid addElement() throws Exception {

 

        // 先創(chuàng)建一個dom樹這個dom樹在內(nèi)存中

        Document dom = DocumentHelper.createDocument();

 

        // 給樹上添加根節(jié)點

        Element books = dom.addElement("books");

 

        // 給根books上添加了2book 標(biāo)簽

        Element book = books.addElement("book");

        Element book2 = books.addElement("book");

 

        // book標(biāo)簽上添加子標(biāo)簽

        Element name = book.addElement("name");

        Element author = book.addElement("author");

        Element price = book.addElement("price");

 

        // book下的子標(biāo)簽中添加文本

        name.setText("九陰真經(jīng)");

        author.addText("李白");

        price.addText("1.1");

 

        // book標(biāo)簽上添加子標(biāo)簽

        Element name2 = book2.addElement("name");

        Element author2 = book2.addElement("author");

        Element price2 = book2.addElement("price");

 

        // book下的子標(biāo)簽中添加文本

        name2.setText("九陽神功");

        author2.addText("趙敏");

        price2.addText("1.2");

 

        // book標(biāo)簽上添加屬性

        book.addAttribute("addr", "藏經(jīng)閣");

        book2.addAttribute("addr", "桃花島");

       

        OutputFormat format = OutputFormat.createPrettyPrint();

        XMLWriter writer = new XMLWriter(newFileOutputStream("books2.xml"),format);

        writer.write(dom);

        // 關(guān)流

        writer.close();

    }

 

 

5.2.6       工具類抽取

 

/**

 * 這時一個工具類它的功能是完成對dom數(shù)的獲取和保存

 *

 * @authorwyait

 * @version 1.0

 */

publicclass DomUtils {

   

    privatestatic Document dom = null;

   

    static{

        try{

            SAXReaderreader = new SAXReader();

            // 獲取dom

            dom = reader.read("users.xml");

        }catch( Exception e ){

            //把異常寫到日志文件中

            System.out.println("恭喜您獲取dom樹失敗");

        }

    }

    /**

     * 用于獲取dom樹的方法

     */

    publicstatic DocumentgetDom(){

        returndom;

    }

   

    /**

     * 保存dom

     */

    publicstaticvoid saveDom(){

        try{

            OutputFormatformat = OutputFormat.createPrettyPrint();

            XMLWriterwriter = new XMLWriter(new FileOutputStream("users.xml"),format);

            writer.write(dom);

            // 關(guān)流

            writer.close();

        }catch(Exception e){

            System.out.println("恭喜您保存dom樹失敗");

        }

    }

}

 

5.2.7       Dom4j生成一個新的XML文件

//1、通過DocumentHelper在內(nèi)存中創(chuàng)建一個Document

Document doc = DocumentHelper.createDocument();

doc.setXMLEncoding(UTF-8);//XML的編碼格式

//生成一個節(jié)點,生成的第一個節(jié)點也是根節(jié)點此方法只使用一次

Element root =doc.addElement(“users”);

root.addElement(user).setText(Jack);//再設(shè)置一個子節(jié)點同時設(shè)值

//寫出,如果有中文請使用前一頁所講的技術(shù)處理

XMLWriter writer= new XMLWriter(new FileOutputStream(“a.xml”));

Writer.write(doc);

Writer.close();

5.3     xpath技術(shù)偏理論

xpath技術(shù) 也是 W3C 組織制定的 快速獲取 xml 文件中某個 標(biāo)簽的 技術(shù)。

l  XML PATH Language。

l  可以實現(xiàn)快速查詢。

l  XPATH包含

  XPath 使用路徑表達(dá)式在XML 文檔中進(jìn)行導(dǎo)航。

  XPath 包含一個標(biāo)準(zhǔn)函數(shù)庫

l  準(zhǔn)備Xpath的包

  jaxen.jar

l  Xpath通過以下方法使用

  dom.selectNodes – 返回一個List對像

  dom.selectSingleNode – 返回一個Node對像

 

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

5.3.1       Xpath示例

//以下選擇所有的user節(jié)點,處理不帶命名空間的安以下原則

List<Element> list =doc.selectNodes("http://user");

System.err.println(list.size());

//以下選擇所有name節(jié)點

list = doc.selectNodes("http://name");//或從要開始:/users//name

System.err.println(list.size());

 

//以下選擇所在帶有country屬性的節(jié)點

list = doc.selectNodes("http://user[@country]");

System.err.println(list.size());

 

//選擇國家是 EN的節(jié)點,可以使用以下方法查詢用戶登錄

//如果country不能重復(fù)則可以使用selectSingleNode

//使用雙引號或單引號都可以//user

Node node =doc.selectSingleNode("http://user[@country=\"EN\"]");

System.err.println(node);

 

xpath / 表示從根開始找標(biāo)簽    // 表示 不考慮標(biāo)簽的位置 只要匹配上就可以

 

//abc[@屬性名選擇abc標(biāo)簽但是要求abc 必須有指定屬性名

 

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

 

在使用xpath技術(shù)結(jié)合 dom4j 快速獲取標(biāo)簽 發(fā)生了異常

報了類沒有找到異常。這時一般情況下都是缺少jar包。

一般如果缺少jar包的話 在報的異常中的第二個單詞或者第三個單詞是jar包的名稱。

 

  • 不區(qū)分大小寫的解決方案

以下均為根據(jù)屬性查詢

//以下查詢id元素為XXname屬性為用戶組的name值的建立全部轉(zhuǎn)成小寫

String path = "http://user[fn:upper-case(@id)=‘XX"'and fn:upper-case(@name)='"+name+"']";

Node n=dom.selectSingleNode(path);//因為確定有一個對象所以使用Single

或是轉(zhuǎn)成小寫以下查詢id屬性為hellobook元素

List list =dom.selectNodes("http://book[fn:lower-case(@id)='hello']");

  • Xpath模糊查詢屬性

查詢屬性中包含某個值的元素類似于like

//book[contains(@id,’A001’)]

//查詢bookid屬性中包含A001字符串的

既然是模糊查詢當(dāng)然要進(jìn)行一下大小寫轉(zhuǎn)換所以

//book[contains(fn:lower-case(@id),’a001’)]

  • Xpath通過查詢子元素的值區(qū)別主要元素:不要使用@符號

XML文檔如下

<books>

<book id=“A001”>

     <name>Oracle編程基礎(chǔ)</name>

     <price>89.99</price>

</book>

</books>

查詢包含Oracle一詞的所有book元素。

//book[name=Oracle]   //精確查詢子元素name的值為Oraclebook元素

//以下是模糊查詢

//book[contains(name,’Oracle’)]

//也可以將name元素的值轉(zhuǎn)成小寫

//book[contains(fn:lower-case(name),’oracle’]

  • Xpath處理帶有命名空間的XML文檔

由于命名空間的namespace是組成元素的一部分即前綴所以處理帶有命名空間的XML文檔時必須要設(shè)置命名空間

XML技術(shù)-Schema約束-Dom4j-Xpath詳解

對于上面的文檔所有的元素都來自于默認(rèn)命名空間。

  • Xpath處理帶有命名空間的XML文檔

SAXReader sax = new SAXReader();

//聲明一個map用于保存命名空間

Map<String,String> uris = newHashMap<String, String>();

//給命名空間取一個別名

uris.put("a","http://www.itcast.cn");

//設(shè)置命名空間后再讀取xml文檔

sax.getDocumentFactory().setXPathNamespaceURIs(uris);

Document dom =sax.read("./xml2/a.xml");

//然后使用帶有命名空間的前綴查詢即可。

dom.selectNodes(“//a:book”);

//帶有屬性的查詢同前

dom.selectNodes(//a:book[@id]

//帶有元素的查詢必須要添加命名空間的前綴

dom.seletNodes(//a:book[a:name=oralce]);  //查詢子元素值為oraclebook元素

 

6.     總結(jié)

l  SAXStAX讀取速度快。都是JAXP的成員。

l  StAXIterator編程接口和Cursor編程接口。

l  Dom4j。Dom。都會將所有節(jié)點加載加載到內(nèi)存中。CRUD非常方便。

l  Dom4j支持XPath.


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI