溫馨提示×

溫馨提示×

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

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

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

發布時間:2020-06-18 17:12:04 來源:網絡 閱讀:4745 作者:wyait 欄目:關系型數據庫

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

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技術

1.     什么是XML

XML 指可擴展標記語言EXtensibleMarkup Language

XML 是一種標記語言很類似 HTML

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

XML 標簽沒有被預定義。您需要自行定義標簽。

XML 被設計為具有自我描述性。

XML W3C 的推薦標準

htmlxml的區別

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

xml可擴展的標記語言。它早期是為了代替html技術但是由于html書寫的網頁在全球占有率太高最后沒有成功。

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

 

2.     XML作用

  • 存儲和傳輸復雜的關系模型數據

  • 在軟件系統中作為配置文件使用主要用途

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

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

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" ?>

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

拖入瀏覽器解析

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

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

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

 

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[

        <h2>html表示的是標題標簽

        <br>html表示換行

    ]]>

   

    &lt;h2&gt;html表示的是標題標簽

   

</demo>

3.5.1       轉義字符

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

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

常見的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等轉義字符!如下:

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

解析的時候:

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

代碼中會導致,本身配置的放行路徑,結果沒有放行!

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

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文件

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

2、書寫一個DTD文件

dtd文件的擴展名必須是dtd

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

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

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

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

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定義

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

 

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

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

告訴我們  當前的xml中可以有一個 books 標簽在這個books標簽下可以有一個或多個book子標簽。

當前括號中的這個標簽可以出現一次或多次

當前括號中的這個標簽可以出現零次或一次

當前括號中的這個標簽可以出現零次或多次

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

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

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

當前這個name標簽中可以書寫文本

 

4.1.3       屬性ATTLIST定義

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

<!ATTLIST  標簽名 

屬性名  屬性類型  屬性約束

屬性名  屬性類型  屬性約束

...

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

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

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

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

 

 

 

4.1.4       實體ENTITY定義

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

相關標簽參考

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

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大大擴充了數據類型支持booleans、numbers、dates and times、URIs、integers、decimal 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>作為其根元素

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

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

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

4.2.3       Schema快速入門

1、定義一個xml文件

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

 

2、書寫一個Schema文件

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

 

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中可以出現的標簽 以及子標簽 等信息

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

        2、element標簽中的 name屬性 就是xml中 可以書寫的標簽的名字

        3、在Schema中它把xml中可以出現的標簽分成簡單標簽和復雜標簽

            簡單標簽只有文本數據的標簽成為簡單標簽

            復雜標簽如果標簽上有屬性或者有子標簽或者有屬性和子標簽 或 屬性和文本的標簽復雜標簽

        4、針對復雜標簽需要在當前的標簽中書寫子標簽來限制當前復雜標簽中的其他內容

            在element標簽中需要使用complexType聲明當前的element標簽name屬性指定的是一個復雜標簽

            如果是簡單標簽可以使用simpleType

        5、對于復雜標簽需要在 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文件。

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

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技術來解析。

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

dom解析技術是W3C組織制定的而所有的編程語言都對這個解析技術使用了自己語言的特點進行實現。

 

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

早期sun公司就制定的 dom 技術。而這個技術在頁面xml的時候需要把整個xml文件加載到內存中可以根據getElementById、getElementsByName 、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包。

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

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

dom4jjar包拷貝我們的項目中

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

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

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

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


 

 

5.2.1       獲取document對象

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

//注意以下類都來自于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對像

 

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

5.3.1       Xpath示例

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

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

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

//以下選擇所有name節點

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

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

 

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

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

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

 

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

//如果country不能重復則可以使用selectSingleNode

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

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

System.err.println(node);

 

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

 

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

 

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

 

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

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

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

 

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

以下均為根據屬性查詢

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

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

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

或是轉成小寫以下查詢id屬性為hellobook元素

List list =dom.selectNodes("http://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文檔時必須要設置命名空間

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

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

  • 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  Dom4j。Dom。都會將所有節點加載加載到內存中。CRUD非常方便。

l  Dom4j支持XPath.


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女