XML技術-Schema約束-Dom4j-Xpath詳解

這輩子沒辦法作太多事情因此每一件都要作到精彩絕倫css

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

 

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

XML技術

1.     什麼是XML

XML 指可擴展標記語言EXtensibleMarkup Languagenode

XML 是一種標記語言很相似 HTMLweb

XML 的設計宗旨是傳輸數據而非顯示數據編程

XML 標籤沒有被預約義。您須要自行定義標籤。瀏覽器

XML 被設計爲具備自我描述性。oracle

XML W3C 的推薦標準app

htmlxml的區別框架

html超文本標記語言。它主要是用來封裝頁面上要顯示的數據最後經過瀏覽器來解析html文件而後把數據展現在瀏覽器上。一樣咱們可使用JSDOM技術對html文件進行解析和操做。

xml可擴展的標記語言。它早期是爲了代替html技術可是因爲html書寫的網頁在全球佔有率過高最後沒有成功。

後期咱們開始使用xml文件做爲軟件的配置文件或者數據的存儲文件以及傳輸數據的文件。

 

2.     XML做用

  • 存儲和傳輸複雜的關係模型數據

  • 在軟件系統中做爲配置文件使用主要用途

爲提升系統的靈活性它所啓動的模塊一般由其配置文件決定

例如一個軟件在啓動時它須要啓動、兩個模塊而A、這兩個模塊在啓動時又分別須要A1A2B1B2模塊的支持爲了準確描述這種關係此時使用文件最爲合適不過。

3.     XML語法

一個XML文件分爲以下幾部份內容

文檔聲明

元素

屬性

註釋 

CDATA 、特殊字符

處理指令processing instruction

3.1     文檔聲明

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

l  最簡單的聲明語法

        <?xmlversion="1.0" ?>

l  encoding屬性說明文檔的字符編碼常用的

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

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

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

wKioL1j1yj6wGCiwAAAdpuf_dNU501.png

拖入瀏覽器解析

wKioL1j1ykjREXCZAAAy4kk7e-k487.png

注意若是使用記事本編輯的話會解析錯誤中文亂碼問題。只是使用記事本編輯的時候會出現其緣由以下

wKiom1j1ylKjSGY6AABxDxN9zE0571.png

 

l  常見錯誤

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

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

3.編碼錯誤

 

3.2     元素element

  • XML元素指XML文件中出現的標籤一個標籤分爲開始標籤和結束標籤一個標籤有以下幾種書寫形式例如

包含標籤體<a>wyait.blog.51cto.com/</a>

不含標籤體的<a></a>,簡寫爲<a/>

  • 一個標籤中也能夠嵌套若干子標籤。但全部標籤必須合理的嵌套絕對不容許交叉嵌套例如

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

  • 格式良好的XML文檔必須有且僅有一個根標籤其它標籤都是這個根標籤的子孫標籤。

  • 對於XML標籤中出現的全部空格和換行XML解析程序都會看成標籤內容進行處理。例以下面兩段內容的意義是不同的。

第一段

<網址> wyait.blog.51cto.com</網址>

第二段

<網址>

         wyait.blog.51cto.com

</網址>

因爲在XML中空格和換行都做爲原始內容被處理因此在編寫XML文件時使用換行和縮進等方式來讓原文件中的內容清晰可讀的「良好」書寫習慣可能要被迫改變。

  • 命名規範

一個XML元素能夠包含字母、數字以及其它一些可見字符但必須遵照下面的一些規範

  • 區分大小寫例如<P><p>是兩個不一樣的標記。

  • 不能以數字開頭

  • 不能包含空格

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

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

  •      屬性

  • 一個標籤能夠有多個屬性每一個屬性都有它本身的名稱和取值例如

                   <inputtype=「text」>

  • 屬性值必定要用雙引號"或單引號'引發來

  • 定義屬性必須遵循與標籤相同的命名規範

  • XML技術中標籤屬性所表明的信息也能夠被改爲用子元素的形式來描述例如

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

3.4     註釋

  • Xml文件中的註釋採用「<!--註釋-->」格式。

注意

XML聲明以前不能有註釋

註釋不能嵌套例如

         <!--大段註釋

         ……

                   <!--局部註釋-->

         ……

         --> 

3.5     CDATA

  • 在編寫XML文件時有些內容可能不想讓解析引擎解析執行而是看成原始內容處理。

  • 遇到此種狀況能夠把這些內容放在CDATA區裏對於CDATA區域內的內容XML解析程序不會處理而是直接原封不動的輸出。

語法<![CDATA[ 內容 ]]>

         <![CDATA[

                   <wyait>

                            <br/>

                   </wyait >

         ]]>

<demo>

    <!--

        當咱們但願把一些文本原樣的顯示在瀏覽器中時

        可使用xml中提供的cdata區域

       

        格式

            <![CDATA[須要原樣顯示的數據]]>

           

        因爲CDATA區域書寫麻煩可使用特殊字符

            &lt;   <

            &gt;   >

    -->

    <![CDATA[

        <h1>html表示的是標題標籤

        <br>html表示換行

    ]]>

   

    &lt;h1&gt;html表示的是標題標籤

   

</demo>

3.5.1       轉義字符

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

wKioL1j1yl_RaAulAAAGD4AXn_g028.png

常見的XML轉義字符記錄以下:

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

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

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

            應當注意,因爲系統定義的基本的縮進的格數不一樣,有的表明4個半角字符,有的表明8個半角字符, 因此可能顯示時效果不一樣。

        若是在xml配置中使用了換行、空格、縮進等,解析的時候會把換行、空格、縮進解析爲\n、 空格、\t等轉義字符!以下:

        wKioL1j5eITgI3dLAAA9YvkAeRc346.jpg

解析的時候:

wKiom1j5eEyAYZY5AAAnHvA8L9g128.jpg

代碼中會致使,自己配置的放行路徑,結果沒有放行!

wKioL1j5e96znxGeAAD136q4jZA620.png

3.6     處理指令processing instruction

  • 處理指令簡稱PI processinginstruction。處理指令用來指揮解析引擎如何解析XML文檔內容。

 

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

 

  • 處理指令必須以「<?」做爲開頭以「?>」做爲結尾XML聲明語句就是最多見的一種處理指令。

 

3.7     總結

l 全部XML 元素都須有關閉標籤

l XML 標籤對大小寫敏感

l XML 必須正確地嵌套順序

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

l XML 的屬性值須加引號

l 特殊字符必須轉義--- CDATA

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

4.     XML約束

  • 什麼是XML約束

XML技術裏能夠編寫一個文檔來約束一個XML文檔的書寫規範這稱之爲XML約束。

  • 爲何須要XML約束

經常使用的約束技術

XML DTD

XML Schema XSD

4.1     DTD約束

DTD的快速入門

1、先建立一個xml文件

 wKiom1j1ymvRH28IAAAzPjcdh90141.png

2、書寫一個DTD文件

dtd文件的擴展名必須是dtd

xml中有多少個標籤在dtd中就書寫多少個ELEMNT

wKioL1j1yn3Ri1sgAAApI5EeNRY006.png

3、在xml文件中導入DTD的約束

 wKioL1j1yozikVnxAAA8wHMSNxo659.png

4.1.1       DTD約束語法

DTDxml文件的結合方式

  • 使用內部DTD

能夠把dtdxml書寫在同一個文件中

<!DOCTYPE 根標籤名 [

dtd的約束

] >

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

 當引用的文件在本地時外部DTD採用以下方式

              <!DOCTYPE文檔根結點 SYSTEM "DTD文件的URL">

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

l 當引用的文件是一個公共的文件時公共DTD採用以下方式 

              <!DOCTYPE文檔根結點 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定義

wKiom1j1yprz_S0JAAAdwPR0Fr4861.png

 

DTD中使用 ELEMENT 聲明當前xml中能夠出現的標籤名稱 () 限制當前這個標籤中的文本或者子標籤。

 wKiom1j1yqXBl7NuAAAFDU07CQA180.png

告訴咱們  當前的xml中能夠有一個 books 標籤在這個books標籤下能夠有一個或多個book子標籤。

當前括號中的這個標籤能夠出現一次或屢次

當前括號中的這個標籤能夠出現零次或一次

當前括號中的這個標籤能夠出現零次或屢次

 wKioL1j1yq7iTPI-AAAG498frmY180.png

括號中的逗號是在定義出現的子標籤的順序。

 wKioL1j1yrehvNsSAAAGN9MffE4633.png

當前這個name標籤中能夠書寫文本

 

4.1.3       屬性ATTLIST定義

 wKiom1j1yr-TpqiXAAAXMdQ9EZg751.png

<!ATTLIST  標籤名 

屬性名  屬性類型  屬性約束

屬性名  屬性類型  屬性約束

...

wKiom1j1ysuAC1OhAAA1fklk3PI238.png

wKioL1j1ytjQsOJyAAASWAL_k8M245.png

wKioL1j1yuPDkQSjAAAHjOjUoyA340.png

當前book標籤上有一個abc屬性這個屬性的值是一個文本可是這個必須是必須書寫的不能省略。

 

 

 

4.1.4       實體ENTITY定義

wKiom1j1yu2gmaWmAAAgGUhk6Ew521.png

相關標籤參考

wKioL1j1yvfjZb8jAAB-oouXhJw666.png

4.2     Schema約束XSD約束

4.2.1       Schema概述

XML Schema是用一套預先規定的XML元素和屬性建立的這些元素和屬性定義了XML文檔的結構和內容模式。 XML Schema規定XML文檔實例的結構和每一個元素/屬性的數據類型

 

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

  • SchemaDTD區別

XMLSGML中繼承了DTD並用它來定義內容的模型驗證和組織元素。同時它也有不少侷限

    DTD不遵照XML語法

    DTD不可擴展

    DTD不支持命名空間的應用

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

Schema徹底克服了這些弱點使得基於Web的應用系統交換XML數據更爲容易。下面是它所展示的一些新特性

    Schema徹底基於XML語法不須要再學習特殊的語法

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

    Schema大大擴充了數據類型支持booleansnumbersdates and timesURIsintegersdecimal numbersreal numbers

    Schema支持原型也就是元素的繼承。如咱們定義了一個聯繫人數據類型而後能夠根據它產生朋友聯繫人客戶聯繫兩種數據類型

    Schema支持屬性組。咱們通常聲明一些公共屬性而後能夠應用於全部的元素屬性組容許把元素、屬性關係放於外部定義、組合

    開放性。原來的DTD只能有一個DTD應用於一個XML文檔如今能夠有多個Schema運用於一個XML文檔。

4.2.2       Schema基本概念
  • XML Schema 文件自身就是一個XML文件但它的擴展名一般爲.xsd

  • XML文件同樣一個XMLSchema文檔也必須有一個根結點但這個根結點的名稱爲Schema

  • 應用schema約束 開發xml 過程

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

 

  • 編寫了一個XMLSchema約束文檔後一般須要把這個文件中聲明的元素綁定到一個地址上這個URI地址叫namespace名稱空間之後XML文件就能夠經過這個URI即名稱空間引用綁定指定名稱空間的元素

  • XML Schema文檔基本結構

W3C XML schema規範中規定全部的Schema文檔都使用<schema>做爲其根元素

wKioL1j1ywWyRjb4AAAUJvxpCCY186.png

<schema>元素能夠包含一些屬性。一個XMLschema聲明看起來常常以以下的形式出現

wKiom1j1yw6x7Cj5AAAychXZg90720.png

4.2.3       Schema快速入門

1、定義一個xml文件

wKioL1j1yxiw_4e2AAAzTahp3oY733.png

 

二、書寫一個Schema文件

wKiom1j1yyPQV8OwAAAxZt-_BfI168.png

 

Schema文件中  必須以 schema做爲 Schema文件的根標籤。

 

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

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

 

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

給當前這個Schema文件起名字當須要被當前這個Schema文件約束的xml文件須要經過當前這個名字引入當前Schema文件。

targetNamespace屬性對應的屬性值能夠是任意的內容。好比targetNamespace="http://www.huyouta.com/books"

 

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

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

    elementFormDefault="qualified">

   

    <!--

        在Schema文件中書寫當前xml中能夠出現的標籤 以及子標籤 等信息

        一、先清楚xml中須要多少標籤在Schema文件中就書寫多少個element標籤

        二、element標籤中的 name屬性 就是xml中 能夠書寫的標籤的名字

        三、在Schema中它把xml中能夠出現的標籤分紅簡單標籤和複雜標籤

            簡單標籤只有文本數據的標籤成爲簡單標籤

            複雜標籤若是標籤上有屬性或者有子標籤或者有屬性和子標籤 或 屬性和文本的標籤複雜標籤

        四、針對複雜標籤須要在當前的標籤中書寫子標籤來限制當前複雜標籤中的其餘內容

            在element標籤中須要使用complexType聲明當前的element標籤name屬性指定的是一個複雜標籤

            若是是簡單標籤可使用simpleType

        五、對於複雜標籤須要在 complexType中書寫sequence 標籤表示子標籤的順序

       

     -->  

    <elementname="books">  <!--books 是一個複雜標籤 -->

        <complexType>

            <sequence>  <!-- 定義當前books 標籤中的子標籤的順序-->

                <element name="book">

                    <complexType>  <!-- 聲明當前的book 又是一個複雜標籤-->

                        <sequence>

                            <!-- 在element 標籤中的 type屬性來限制當前單標籤中文本的類型 -->

                            <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所指定的名稱空間限定

總結

  • 在書寫Schema文件的時候須要在Schema文件中 使用 targetNamespace 屬性 給當前的Schema文件起名。

  • targetNamespace屬性的值作爲當前 Schema文件的名稱空間。

  • xml文件中 須要 經過 xmlns 來引入不一樣名稱下的Schema文件。

  • 若是咱們在同一個 xml文件中引入了多個Schema的名稱空間這時須要你們給這些名稱空間其別名。

  • 若是在xml文件使用了多個 xmlns引入多個名稱空間時須要在xmlns後面使用冒號給當前的名稱空間起名。經過這個別區分到底當前xml中的標籤受限於具體哪一個Schema文件。

wKiom1j1yzSjg-jRAABpxt9OUlM983.png

5.     XML解析

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

特色

一次將全部數據所有加載到內存中。

xml文檔中的每個節點都當成一個Node對像處理。包括元素、文本、屬性。

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

很是方便進行修改。

已經集成在了JDK中是Sunxml操做的標準。

缺點是當文檔數據量很大時對內存的佔用很大。

Sax Sample Api for XML

在讀取數據時分析數據經過事件監聽器來完成。

速度快但只適合讀取數據僅向前讀取不可後退。

  • xml可擴展的標記語言。

無論是html文件仍是xml文件它們都是標記型文檔均可以使用w3c組織制定的dom技術來解析。

wKioL1j1y0GCN_ugAAAsrRh6odE231.png

dom解析技術是W3C組織制定的而全部的編程語言都對這個解析技術使用了本身語言的特色進行實現。

 

Javadom技術解析標記型文檔也作了實現

早期sun公司就制定的 dom 技術。而這個技術在頁面xml的時候須要把整個xml文件加載到內存中能夠根據getElementByIdgetElementsByName getElementsByTagName 等方法解析。

 

sun公司在JDK6版本對 dom解析技術進行升級 SAX解析 Stax 解析

sun公司的解析統稱 JAXP

5.1     解析XML的方式

  • JAXP(JavaApi for Xml Programming) sun公司的一套操做XMLAPI.

  • DOM解析-一次性的將數據所有裝入內存。

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

  • Dom4j(Document For Java)-第三方開源是從jdom分裂出來的解析技術。目前jdom已經徹底被dom4j替代。

  • jDom Dom4j的前身。

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

  • StAX JDK1.6新特性作爲JAXP的新成員已經集成在了JDK6當中。

  •      Dom4j

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

目前不少開源框架如struts,hibernate都使用dom4j作爲解析其xml的工具。

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

 

因爲dom4j 它不是sun公司的技術而屬於第三方公司的技術咱們須要使用dom4j 就須要到dom4j官網下載dom4jjar包。

wKiom1j1y1GSoSpAAAADzBQYmZQ680.png

wKioL1j1y1yDKzCgAAAfnWv8zPM963.png

dom4jjar包拷貝咱們的項目中

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

wKioL1j1y2WidyXoAAAQGV1scrk904.png

jar包添加到當前的classpath路徑中

wKioL1j1y3KTjFG_AABBZ1ZVI6Q626.png


 

 

5.2.1       獲取document對象

wKiom1j1y4HgZRU9AAAxG3RTgT8608.png

//注意如下類都來自於org.dom4j

//1、實例化解析器

SAXReader sax = newSAXReader();

//2、讀取xml文檔

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

//3、必須先獲取根節點

Element root =doc.getRootElement();

//4、獲取第一我的的姓名

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

System.err.println(name);

 

5.2.2       獲取全部標籤中的文本值

    //演示使用dom4j 獲取 xml中的標籤中的數據

    publicstaticvoid getElement()throws Exception{

        SAXReader reader = new SAXReader();

        // 獲取dom

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

       

        //獲取xml中的根標籤

        Element root = dom.getRootElement();

       

        //獲取根標籤下的全部子標籤

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

       

        //遍歷集合獲取到每一個 user標籤

        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       修改指定標籤中的值

    //把最後一個user中的sex 修改成女

    publicstaticvoid UpdateElement()throws Exception{

        SAXReader reader = new SAXReader();

        // 獲取dom

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

       

        //先獲取根標籤

        Element root = dom.getRootElement();

        //獲取 users 下的全部user標籤

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

        

        //獲取最後一個user標籤

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

       

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

       

        sex.setText("");

       

        //把內存中修改後的dom樹從新寫到xml文件中

        //建立用於寫出數據的流對象

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

       

        //建立一個格式器

        OutputFormat format = OutputFormat.createPrettyPrint();

        //設置編碼表

        format.setEncoding("gbk");

       

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

        //寫出數據

        writer.write(dom);

        //關流

        writer.close();

       

    }

 

 

5.2.4       刪除標籤

 

    // 刪除

    publicstaticvoid deleteElement() throws Exception {

        SAXReader reader = new SAXReader();

        // 獲取dom

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

 

        // 刪除最後一個user標籤

 

        // 先獲取根標籤

        Element root = dom.getRootElement();

        // 獲取 users 下的全部user標籤

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

 

        // 獲取最後一個user標籤

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

 

        root.remove(lastUser);

 

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

        writer.write(dom);

        // 關流

        writer.close();

 

    }

 

 

5.2.5       增長標籤

 

    // 建立一個新的dom寫到文件

    publicstaticvoid addElement() throws Exception {

 

        // 先建立一個dom樹這個dom樹在內存中

        Document dom = DocumentHelper.createDocument();

 

        // 給樹上添加根節點

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

 

        // 給根books上添加了2book 標籤

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

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

 

        // book標籤上添加子標籤

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

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

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

 

        // book下的子標籤中添加文本

        name.setText("九陰真經");

        author.addText("李白");

        price.addText("1.1");

 

        // book標籤上添加子標籤

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

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

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

 

        // book下的子標籤中添加文本

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

        author2.addText("趙敏");

        price2.addText("1.2");

 

        // book標籤上添加屬性

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

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

       

        OutputFormat format = OutputFormat.createPrettyPrint();

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

        writer.write(dom);

        // 關流

        writer.close();

    }

 

 

5.2.6       工具類抽取

 

/**

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

 *

 * @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);

            // 關流

            writer.close();

        }catch(Exception e){

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

        }

    }

}

 

5.2.7       Dom4j生成一個新的XML文件

//1、經過DocumentHelper在內存中建立一個Document

Document doc = DocumentHelper.createDocument();

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

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

Element root =doc.addElement(「users」);

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

//寫出,若是有中文請使用前一頁所講的技術處理

XMLWriter writer= new XMLWriter(new FileOutputStream(「a.xml」));

Writer.write(doc);

Writer.close();

5.3     xpath技術偏理論

xpath技術 也是 W3C 組織制定的 快速獲取 xml 文件中某個 標籤的 技術。

l  XML PATH Language

l  能夠實現快速查詢。

l  XPATH包含

  XPath 使用路徑表達式在XML 文檔中進行導航。

  XPath 包含一個標準函數庫

l  準備Xpath的包

  jaxen.jar

l  Xpath經過如下方法使用

  dom.selectNodes – 返回一個List對像

  dom.selectSingleNode – 返回一個Node對像

 

wKiom1j1y5LgkJvEAABQSSkYDm8452.png

5.3.1       Xpath示例

//如下選擇全部的user節點,處理不帶命名空間的安如下原則

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

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

//如下選擇全部name節點

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

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

 

//如下選擇所在帶有country屬性的節點

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

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

 

//選擇國家是 EN的節點,可使用如下方法查詢用戶登陸

//若是country不能重複則可使用selectSingleNode

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

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

System.err.println(node);

 

xpath / 表示從根開始找標籤    // 表示 不考慮標籤的位置 只要匹配上就能夠

 

//abc[@屬性名選擇abc標籤可是要求abc 必須有指定屬性名

 

wKioL1j1y5_wtZuUAACJpyMp8r0043.png

 

在使用xpath技術結合 dom4j 快速獲取標籤 發生了異常

報了類沒有找到異常。這時通常狀況下都是缺乏jar包。

通常若是缺乏jar包的話 在報的異常中的第二個單詞或者第三個單詞是jar包的名稱。

 

  • 不區分大小寫的解決方案

如下均爲根據屬性查詢

//如下查詢id元素爲XXname屬性爲用戶組的name值的創建所有轉成小寫

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

Node n=dom.selectSingleNode(path);//由於肯定有一個對象因此使用Single

或是轉成小寫如下查詢id屬性爲hellobook元素

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

  • Xpath模糊查詢屬性

查詢屬性中包含某個值的元素相似於like

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

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

既然是模糊查詢固然要進行一下大小寫轉換因此

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

  • Xpath經過查詢子元素的值區別主要元素:不要使用@符號

XML文檔以下

<books>

<book id=「A001」>

     <name>Oracle編程基礎</name>

     <price>89.99</price>

</book>

</books>

查詢包含Oracle一詞的全部book元素。

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

//如下是模糊查詢

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

//也能夠將name元素的值轉成小寫

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

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

因爲命名空間的namespace是組成元素的一部分即前綴因此處理帶有命名空間的XML文檔時必需要設置命名空間

wKiom1j1y6qCa6GUAAAychXZg90884.png

對於上面的文檔全部的元素都來自於默認命名空間。

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

SAXReader sax = new SAXReader();

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

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

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

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

//設置命名空間後再讀取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.     總結

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

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

l  Dom4jDom。都會將全部節點加載加載到內存中。CRUD很是方便。

l  Dom4j支持XPath.

相關文章
相關標籤/搜索