JavaWeb之XML詳解

来源:http://www.cnblogs.com/McCa/archive/2016/10/08/5938736.html
-Advertisement-
Play Games

XML語言 什麼是XML? XML是指可擴展標記語言(eXtensible Markup Language),它是一種標記語言,很類似HTML。它被設計的宗旨是傳輸數據,而非顯示數據。 XML標簽沒有被預定義,需要用戶自行定義標簽。 XML技術是W3C組織(World Wide Web Consor ...


XML語言

什麼是XML?

  XML是指可擴展標記語言(eXtensible Markup Language),它是一種標記語言,很類似HTML。它被設計的宗旨是傳輸數據,而非顯示數據。 XML標簽沒有被預定義,需要用戶自行定義標簽。 XML技術是W3C組織(World Wide Web Consortium萬維網聯盟)發佈的,目前遵循的是W3C組織於2000年發佈的XML1.0規範。 XML被廣泛認為是繼Java之後在Internet上最激動人心的新技術。

XML技術用於解決什麼問題?

  在現實生活中存在大量有關係的數據,如右圖所示。 

問題:這樣的數據該如何表示並交給電腦處理呢?

 

XML語言出現的根本目的在於描述向上圖那種有關係的數據。

XML是一種通用的數據交換格式。

在XML語言中,它允許用戶自定義標簽。一個標簽用於描述一段數據;一個標簽可分為開始標簽和結束標簽,在起始標簽之間,又可以使用其它標簽描述其它數據,以此來實現數據關係的描述。

XML中的數據必須通過軟體程式來解析執行或顯示,如IE;這樣的解析程式稱之為Parser(解析器)。

 

<?xml version="1.0" encoding="UTF-8"?>
<中國>
    <北京>
        <海澱></海澱>
        <丰台></丰台>
    </北京>
    <山東>
        <濟南></濟南>
        <青島></青島>
    </山東>
    <湖北>
        <武漢></武漢>
        <荊州></荊州>
    </湖北>
</中國>

 

XML常見應用:

XML技術除用於保存有關係的數據之外,它還經常用作軟體配置文件,以描述程式模塊之間的關係。(如後面將要學習到的Struts、Spring和Hibernate都是基於XML作為配置文件的)

在一個軟體系統中,通過XML配置文件可以提高系統的靈活性。即程式的行為是通過XML文件來配置的,而不是硬編碼。

數據交換:不同語言之間用來交換數據

小型資料庫:用來當資料庫存儲數據。

XML語法:

XML語法:

一個XML文件分為如下幾部分內容:

  文檔聲明 元素 屬性 註釋 CDATA區 、特殊字元 處理指令(PI:Processing Instruction)

文檔聲明

在編寫XML文檔時,需要先使用文檔聲明來聲明XML文檔。且必須出現在文檔的第一行。並且必須指定

最簡單的語法:

<?xml version=“1.0”?>

 

encoding屬性說明文檔所使用的字元編碼。保存在磁碟上的文件編碼要與聲明的編碼一致。如:

<?xml version=“1.0” encoding=“GB2312”?>

 

standalone屬性說明文檔是否獨立,即是否依賴其他文檔。 如:

<?xml version=“1.0” standalone=“yes”?> 

yes不用引入外部的文件,no需要引入。(不常用)

元素

標簽

XML元素指XML文件中出現的標簽。

一個標簽分為起始和結束標簽(不能省略)。一個標簽有如下幾種書寫形式:

  包含標簽主體:<mytag>some content</mytag>

  不含標簽主體:<mytag/>

一個標簽中可以嵌套若幹子標簽,但所有標簽必須合理的嵌套,不允許有交叉嵌套。

<mytag1><mytag2></mytag1></mytag2> WRONG!

一個XML文檔必須有且僅有一個根標簽,其他標簽都是這個根標簽的子標簽或孫標簽。

標簽的空格、換行

對於XML標簽中出現的所有空格和換行,XML解析程式都會當作標簽內容進行處理。例如:下麵兩段內容的意義是不一樣的。

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

命名規範

一個XML元素可以包含字母、數字以及其它一些可見字元,但必須遵守下麵的一些規範:

  區分大小寫,例如,<P>和<p>是兩個不同的標記。

  不能以數字或“-” (中劃線)開頭。

  不能以xml(或XML、或Xml 等)開頭。

  不能包含空格。

  名稱中間不能包含冒號(:)。

屬性

一個元素可以有多個屬性,每個屬性都有它自己的名稱和取值,例如:<mytag name=“value” …/>

屬性值一定要用引號(單引號或雙引號)引起來。

屬性名稱的命名規範與元素的命名規範相同

元素中的屬性是不允許重覆的

在XML技術中,標簽屬性所代表的信息也可以被改成用子元素的形式來描述,例如:

<mytag>
    <name>
        <firstName/>
        <lastName/>
    </name>
</mytag>

註釋

XML中的註釋語法為:<!--這是註釋-->

註意:

  XML聲明之前不能有註釋

  註釋不能嵌套,例如:

  

轉義字元

   

 註:< 和 & 的符號要用轉義字元, > “ ‘ 可以不使用轉義字元。

CDATA區

CDATA是Character Data的縮寫

作用:把標簽當做普通文本內容;

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

<![CDATA[

  <itcast>www.itcast.cn</itcast>

]]>

以上紅色部分被當做普通文本而不是標簽

處理指令

處理指令,簡稱PI(Processing Instruction)。

作用:用來指揮軟體如何解析XML文檔。

語法:必須以“<?”作為開頭,以“?>”作為結尾。 常用處理指令:

常用處理指令:  

  XML聲明:

    <?xml version=“1.0” encoding=“GB2312”?>

  xml-stylesheet指令: 作用:指示XML文檔所使用的CSS樣式XSL。

    <?xml-stylesheet type=“text/css” href=“some.css”?>

    註:對中文命名的標簽元素不起作用

XML語法規則總結

  所有 XML 元素都須有關閉標簽

  XML 標簽對大小寫敏感 XML

  必須正確地嵌套順序

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

  XML 的屬性值須加引號

  特殊字元必須轉義 --- CDATA

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

 

XML約束:

為什麼需要約束

 1.XML都是用戶自定義的標簽,若出現小小的錯誤,軟體程式將不能正確地獲取文件中的內容而報錯。(如:Tomcat)

 2.XML技術中,可以編寫一個文檔來約束一個XML的書寫規範,這個文檔稱之為約束。

  兩個概念:

    格式良好的XML:遵循XML語法的XML

    有效的XML:遵循約束文檔的XML

 3.總之:約束文檔定義了在XML中允許出現的元素名稱、屬性及元素出現的順序等等。

XML約束概述

1.什麼是XML約束

  在XML技術里,可以編寫一個文檔來約束一個XML

  文檔的書寫規範,這稱之為XML約束。

2.為什麼需要XML約束

3.常用的約束技術

  XML DTD

  XML Schema

 

XML約束之DTD約束

DTD概述

  1.DTD(Document Type Definition),全稱為文檔類型定義。

  

  2.書寫完成DTD,並且約束成功後,可以總結書寫的過程,更方便記憶。

  複雜標簽:<!ELEMENT 標簽名 (子節點)>

  簡單標簽:<!ELEMENT 標簽名 (#PCDATA)>

  引入DTD:<!DOCTYPE 根節點 SYSTEM “dtd的地址”>

將DTD與XML文檔關聯三種方式

  DTD約束即可以作為一個單獨的文件編寫,也可以在XML文件內編寫

  1.使用內部DTD

    <!DOCTYPE 根節點 [ DTD的代碼 ]>

  2.使用外部DTD

    <!DOCTYPE 根節點 SYSTEM “DTD的地址” >

  3.使用網路DTD

    <!DOCTYPE 根節點 PUBLIC “DTD的名稱” “DTD的地址” >

    常見的使用網路DTD約束有 Struts2的框架

在xml文件內編寫DTD

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 書架 [
    <!ELEMENT 書架 (書+)>
    <!ELEMENT 書 (書名,作者,售價)>
    <!ELEMENT 書名 (#PCDATA)>
    <!ELEMENT 作者 (#PCDATA)>
    <!ELEMENT 售價 (#PCDATA)>
]>
<書架>
    <>
        <書名>Java就業培訓教程</書名>
        <作者>張孝祥</作者>
        <售價>39.00元</售價>
    </>
    ...
</書架>

引入外部DTD文檔

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

    當引用的DTD文檔在本地時,採用如下方式:  

    <!DOCTYPE 根元素 SYSTEM “DTD文檔路徑”>

    如:

<!DOCTYPE 書架 SYSTEM “book.dtd”>

    當引用的DTD文檔在公共網路上時,採用如下方式:   

    <!DOCTYPE 根元素 PUBLIC “DTD名稱” “DTD文檔的URL”>

    如:

<!DOCTYPE web-app PUBLIC 
        "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
        "http://java.sun.com/dtd/web-app_2_3.dtd">

DTD約束語法細節

   元素定義 屬性定義 實體定義

元素(ELEMENT)定義

  在DTD文檔中使用ELEMENT關鍵字來聲明一個XML元素。

  語法:<!ELEMENT 元素名稱 使用規則> 

    使用規則:

      (#PCDATA):指示元素的主體內容只能是普通的文本.(Parsed Character Data)

      EMPTY:用於指示元素的主體為空。比如<br/>

      ANY:用於指示元素的主體內容為任意類型。

      (子元素):指示元素中包含的子元素

    定義子元素及描述它們的關係:

      如果子元素用逗號分開,說明必須按照聲明順序去編寫XML文檔。

       如: <!ELEMENT FILE (TITLE,AUTHOR,EMAIL)

      如果子元素用“|”分開,說明任選其一。

       如:<!ELEMENT FILE (TITLE|AUTHOR|EMAIL)

      用+、*、?來表示元素出現的次數

        如果元素後面沒有+*?:表示必須且只能出現一次

        +:表示至少出現一次,一次或多次

        *:表示可有可無,零次、一次或多次

        ?:表示可以有也可以無,有的話只能有一次。零次或一次 如: <!ELEMENT MYFILE ((TITLE*, AUTHOR?, EMAIL)* | COMMENT)>

 

 屬性(ATTLIST)定義

  屬性聲明舉例
<!ATTLIST 商品
    類別 CDATA #REQUIRED 必須的
    顏色 CDATA #IMPLIED  可選的
>

  對應的XML為:<商品 類別=“服裝” 顏色=“黃色”/>

   屬性值類型

  CDATA:表示屬性的取值為普通的文本字元串

  ENUMERATED (DTD沒有此關鍵字):表示枚舉,只能從枚舉列表中任選其一,如(雞肉|牛肉|豬肉|魚肉)

  ID:表示屬性的取值不能重覆(不能只寫數字)

  設置說明

  #REQUIRED:表示該屬性必須出現

  #IMPLIED:表示該屬性可有可無

  #FIXED:表示屬性的取值為一個固定值。語法:#FIXED "固定值"

  直接值:表示屬性的取值為該預設值

 

  定義屬性示例
<!ATTLIST 頁面作者 
         姓名 CDATA #IMPLIED 
         年齡 CDATA #IMPLIED 
         聯繫信息 CDATA #REQUIRED 
         網站職務 CDATA #FIXED "頁面作者" 
         個人愛好 CDATA "上網"
       > 

  

屬性的類型可以是一組取值的列表,在 XML 文件中設置的屬性值只能是這個列表中的某個值(枚舉)

 

<?xml version = "1.0" encoding="GB2312" standalone="yes"?>
<!DOCTYPE 購物籃 [
    <!ELEMENT 肉 EMPTY>
    <!ATTLIST 肉 品種 ( 雞肉 | 牛肉 | 豬肉 | 魚肉 ) "雞肉">
]> 
<購物籃>
    <肉 品種="魚肉"/>
    <肉 品種="牛肉"/>
    </>
</購物籃>

表示屬性的設置值為一個唯一值。

ID 屬性的值只能由字母,下劃線開始,不能出現空白字元

 

?xml version = "1.0" encoding="GB2312" ?>

<!DOCTYPE 聯繫人列表[
    <!ELEMENT 聯繫人列表 ANY>
    <!ELEMENT 聯繫人(姓名,EMAIL)>
    <!ELEMENT 姓名(#PCDATA)>
    <!ELEMENT EMAIL(#PCDATA)>
    <!ATTLIST 聯繫人 編號 ID #REQUIRED>
]>

<聯繫人列表>
    <聯繫人 編號=“p1">
        <姓名>張三</姓名>
        <EMAIL>[email protected]</EMAIL>
     </聯繫人>
    <聯繫人 編號=“p2">
        <姓名>李四</姓名>
        <EMAIL>[email protected]</EMAIL>
    </聯繫人>
</聯繫人列表>

實體定義 

  實體用於為一段內容創建一個別名,以後在XML文檔中就可以使用別名引用這段內容了。

  在DTD定義中,一條<!ENTITY …>語句用於定義一個實體。

  <!ENTITY 別名 “值”>

  在元素中引用 &別名; 

  定義引用實體 

   概念:在DTD中定義,在XML中使用

   語法:<!ENTITY 實體名稱 “實體內容”>

   引用方式(註意是在XML中使用):&實體名稱;

   

  DTD中定義: <!ENTITY copyright “博客園版權所有”>

  XML中引用: &copyright;

 

XML約束之Schema

Schema概述:

XML Schema 也是一種用於定義和描述 XML 文檔結構與內容的模式語言,其出現是為了剋服 DTD 的局限性

  XML Schema vs DTD:

  XML Schema符合XML語法結構。

  DOM、SAX等XML API很容易解析出XML Schema文檔中的內容。

  XML Schema對名稱空間支持得非常好。

  XML Schema比XML DTD支持更多的數據類型,並支持用戶自定義新的數據類型。

  XML Schema定義約束的能力非常強大,可以對XML實例文檔作出細緻的語義限制。

  XML Schema不能像DTD一樣定義實體,比DTD更複雜,但Xml Schema現在已是w3c組織的標準,它正逐步取代DTD。

  好處:

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

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

  Schema和DTD區別

XML從SGML中繼承了DTD,並用它來定義內容的模型,驗證和組織元素。同時,它也有很多局限:

  DTD不遵守XML語法; DTD不可擴展; DTD不支持命名空間的應用; DTD沒有提供強大的數據類型支持,只能表示很簡單的數據類型。

Schema完全剋服了這些弱點,使得基於Web的應用系統交換XML數據更為容易。下麵是它所展現的一些新特性:

  Schema完全基於XML語法,不需要再學習特殊的語法; Schema能用處理XML文檔的工具處理,而不需要特殊的工具; Schema大大擴充了數據類型,支持booleans、numbers、dates and times、URIs、integers、decimal numbers和real numbers等; Schema支持原型,也就是元素的繼承。如:我們定義了一個“聯繫人”數據類型,然後可以根據它產生“朋友聯繫人”和“客戶聯繫”兩種數據類型; Schema支持屬性組。我們一般聲明一些公共屬性,然後可以應用於所有的元素,屬性組允許把元素、屬性關係放於外部定義、組合; 開放性。原來的DTD只能有一個DTD應用於一個XML文檔,現在可以有多個Schema運用於一個XML文檔。

Schema一些概念

XML Schema 文件自身就是一個XML文件,但它的擴展名通常為.xsd

和XML文件一樣,一個XML Schema文檔也必須有一個根結點,但這個根結點的名稱為Schema

應用schema約束 開發xml 過程:

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

 

XMLSchema文檔基本結構

在W3C XML schema規範中規定:所有的Schema文檔都使用<schema>作為其根元素

 

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

 

Schema入門案例

book.xsd文件

<?xml version="1.0" encoding="UTF-8" ?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                      targetNamespace="http://www. itcast.cn"
                      elementFormDefault="qualified">
    <xs:element name='書架' >
        <xs:complexType>
            <xs:sequence maxOccurs='unbounded' >
                <xs:element name='書' >
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name='書名' type='xs:string' />
                            <xs:element name='作者' type='xs:string' />
                            <xs:element name='售價' type='xs:string' />
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

 

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

<itcast:書架 xmlns:itcast="http://www.itcast.cn"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation=“http://www.itcast.cn book.xsd">

    <itcast:>
        <itcast:書名>九陰真經</itcast:書名>
        <itcast:作者>郭靖</itcast:作者>
        <itcast:售價>28.00元</itcast:售價>
    </itcast:書>
</itcast:書架>

在XML Schema文檔中聲明名稱空間

 

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
               targetNamespace="http://www. itcast.cn"
               elementFormDefault="qualified"
               attributeFormDefault="qualified"
>
<xs:schema>

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

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

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

名稱空間的概念:

  在XML Schema中,每個約束模式文檔都可以被賦以一個唯一的名稱空間,名稱空間用一個唯一的URI(Uniform Resource Identifier,統一資源標識符)表示。 在Xml文件中書寫標簽時,可以通過名稱空間聲明(xmlns),來聲明當前編寫的標簽來自哪個Schema約束文檔。如:

<itcast:書架 xmlns:itcast=“http://www.itcast.cn”>
        <itcast:書>……</itcast:書>
</itcast:書架>

此處使用itcast來指向聲明的名稱,以便於後面對名稱空間的引用。

 註意:名稱空間的名字語法容易讓人混淆,儘管以 http:// 開始,那個 URL 並不指向一個包含模式定義的文件。事實上,這個 URL:http://www.itcast.cn根本沒有指向任何文件,只是一個分配的名字。

使用名稱空間引入Schema

 為了在一個XML文檔中聲明它所遵循的Schema文件的具體位置,通常需要在Xml文檔中的根結點中使用schemaLocation屬性來指定,例如:

<itcast:書架 xmlns:itcast="http://www.itcast.cn"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=“http://www.itcast.cn book.xsd">

schemaLocation此屬性有兩個值。第一個值是需要使用的命名空間。第二個值是供命名空間使用的 XML schema 的位置,兩者之間用空格分隔。

 註意:在使用schemaLocation屬性時,也需要指定該屬性來自哪裡。

使用預設名稱空間

基本格式:

  xmlns="URI" 

舉例:

<書架 xmlns=" http://www.itcast.cn"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation=“http://www.itcast.cn book.xsd">
        <>
          <書名>JavaScript網頁開發</書名>
          <作者>張孝祥</作者>
          <售價>28.00元</售價>
        </>
</書架>

使用名稱空間引入多個XML Schema文檔

文件清單:xmlbook.xml

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

<書架 xmlns="http://www.it315.org/xmlbook/schema" 
    xmlns:demo="http://www.it315.org/demo/schema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.it315.org/xmlbook/schema                 http://www.it315.org/xml/book.xsd 
        http://www.it315.org/demo/schema http://www.it315.org/demo.xsd">
    <>
        <書名>JavaScript網頁開發</書名>
        <作者>張孝祥</作者>
        <售價 demo:幣種=”人民幣”>28.00元</售價>
    </書>
</書架>

XML Schema基礎概念

Schema元素:簡單類型和複雜類型

XML Schema規範中將元素分為兩種類型

  簡單類型元素:簡單類型元素只能包含字元內容。這些字元可以被約束為特殊的預定義類型或派生類型。例如,可以指定一個簡單元素的內容必須是日期、整數、字元串或者僅僅是一個字元或者一系列字元。type屬性

  複雜類型元素:複雜類型元素是包含子元素內容或者屬性的元素 <complexType> <sequence> 子元素

Schema語法

參看w3c文檔

 

XML編程(CRUD)

XML解析技術概述

  XML解析方式分為兩種:

DOM方式和SAX方式

  DOM:Document Object Model,文檔對象模型。這種方式是W3C推薦的處理XML的一種方式。

  SAX:Simple API for XML。這種方式不是官方標準,屬於開源社區XML-DEV,幾乎所有的XML解析器都支持它。

  XML解析開發包 :

  JAXP:是SUN公司推出的解析標準實現。

  Dom4J:是開源組織推出的解析開發包。(牛,大家都在用,包括SUN公司的一些技術的實現都在用) J

  Dom:是開源組織推出的解析開發包。 

  JAXP:

  JAXP:(Java API for XML Processing)開發包是JavaSE的一部分,它由以下幾個包及其子包組成:

    org.w3c.dom:提供DOM方式解析XML的標準介面

    org.xml.sax:提供SAX方式解析XML的標準介面

    javax.xml:提供瞭解析XML文檔的類

  javax.xml.parsers包中,定義了幾個工廠類。我們可以通過調用這些工廠類,得到對XML文檔進行解析的DOM和SAX解析器對象。                 DocumentBuilderFactory

     SAXParserFactory

DOM解析:

  使用JAXP進行DOM解析 

  javax.xml.parsers 包中的DocumentBuilderFactory用於創建DOM模式的解析器對象 , DocumentBuilderFactory是一個抽象工廠類,它不能直接實例化,但該類提供了一個newInstance方法 ,這個方法會根據本地平臺預設安裝的解析器,自動創建一個工廠的對象並返回。

 

 

獲得JAXP中的DOM解析器

  調用 DocumentBuilderFactory.newInstance() 方法得到創建 DOM 解析器的工廠。

  調用工廠對象的 newDocumentBuilder方法得到 DOM 解析器對象。

  調用 DOM 解析器對象的 parse() 方法解析 XML 文檔,得到代表整個文檔的 Document 對象,進行可以利用DOM特性對整個XML文檔進行操作了。

DOM編程介紹

DOM模型(document object model)

  DOM解析器在解析XML文檔時,會把文檔中的所有元素,按照其出現的層次關係,解析成一個個Node對象(節點)。

  在dom中,節點之間關係如下:

    位於一個節點之上的節點是該節點的父節點(parent)

    一個節點之下的節點是該節點的子節點(children)

    同一層次,具有相同父節點的節點是兄弟節點(sibling)

    一個節點的下一個層次的節點集合是節點後代(descendant)

    父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)

節點類型:Node對象

  Node對象提供了一系列常量來代表結點的類型,當開發人員獲得某個Node類型後,就可以把Node節點轉換成相應的節點對象(Node的子類對象),以便於調用其特有的方法。(查看API文檔)

  Node對象提供了相應的方法去獲得它的父結點或子結點。編程人員通過這些方法就可以讀取整個XML文檔的內容、或添加、修改、刪除XML文檔的內容了。

 

DOM方式解析XML文件

  DOM解析編程:

  1獲取指定節點的集合

  2查找某一個節點

  3刪除結點

  4更新結點內容

  5添加節點

  6獲取所有的節點的名稱(遞歸遍歷)

具體步驟為:

  1通過document.getElementsByTagName(“”) 可以獲取節點集合 返回NodeList

  2通過Document.createElement(“”)可以創建元素對象。

  3Node對象中可以設置文本內容 setTextContent()

  4通過Node的appendChild()方法加入子節點。

  5需要把記憶體中的DOM樹形結構回寫到xml文件中。

  6TransformerFactory工廠類創建Transformer回寫類,通過transform(Souuce,Result)方法回寫xml。

  7New DOMSource(document) 和 new StreamResult(xml) 回寫完成。

  8遞歸方法就是自己調用自己 

public static void getNodeName(Node node){
    if(node.getNodeType() == Node.ELEMENT_NODE){
        System.out.println(node.getNodeName());
    }
    NodeList nodeList = node.getChildNodes();
    for(int i=0;i<nodeList.getLength();i++){
        Node child = nodeList.item(i);
        getNodeName(child);
    }
}
                

更新XML文檔

javax.xml.transform包中的Transformer類用於把代表XML文件的Document對象轉換為某種格式後進行輸出,例如把xml文件應用樣式表後轉成一個html文檔。利用這個對象,當然也可以把Document對象又重新寫入到一個XML文件中。

Transformer類通過transform方法完成轉換操作,該方法接收一個源和一個目的地。我們可以通過:

  javax.xml.transform.dom.DOMSource類來關聯要轉換的document對象

  用javax.xml.transform.stream.StreamResult 對象來表示數據的目的地。

 Transformer對象通過TransformerFactory獲得。

 

SAX解析:

  SAX解析的優點:

  在使用 DOM 解析 XML 文檔時,需要讀取整個 XML 文檔,在記憶體中構架代表整個 DOM 樹的Doucment對象,從而再對XML文檔進行操作。此種情況下,如果 XML 文檔特別大,就會消耗電腦的大量記憶體,並且容易導致記憶體溢出。

  SAX解析允許在讀取文檔的時候,即對文檔進行處理,而不必等到整個文檔裝載完才會文檔進行操作    

  解析器和事件處理器:

  SAX採用事件處理的方式解析XML文件,利用 SAX 解析 XML 文檔,涉及兩個部分:解析器 事件處理器

    解析器可以使用JAXP的API創建,創建出SAX解析器後,就可以指定解析器去解析某個XML文檔。

    解析器採用SAX方式在解析某個XML文檔時,它只要解析到XML文檔的一個組成部分,都會去調用事件處理器的一個方法,解析器在調用事件處理器的方法時,會把當前解析到的xml文件內容作為方法的參數傳遞給事件處理器。

    事件處理器由程式員編寫,程式員通過事件處理器中方法的參數,就可以很輕鬆地得到sax解析器解析到的數據,從而可以決定如何對數據進行處理。

  SAX解析原理:

  SAX 是事件驅動的 XML 處理方法

  它是基於事件驅動的

  startElement() 回調在每次 SAX 解析器遇到元素的起始標記時被調用

  characters() 回調為字元數據所調用

  endElement() 為元素的結束標記所調用

  DefaultHandler類(在 org.xml.sax.helpers 軟體包中)來實現所有這些回調,並提供所有回調方法預設的空實現  

  SAX的事件驅動模型:

  

  SAX DocumentHandler示例

SAX 解析器採用了基於事件的模型,它在解析XML文檔的時候可以觸發一系列的事件

發生相應事件時,將調用一個回調方法

<?xml version=“1.0” encoding=“utf-8”?>
<config>
    <server>UNIX</server>
</config>

Start document

Start element (config)

Characters (whitespace)

Start element (server)

Characters (UNIX)

End element (server)

Characters (whitespace)

End element (config)

End document

  使用SAX方式解析XML:

使用SAXParserFactory創建SAX解析工廠

  SAXParserFactory spf = SAXParserFactory.newInstance();

通過SAX解析工廠得到解析器對象

  SAXParser sp = spf.newSAXParser();

通過解析器對象解析xml文件 xmlReader.parse("book.xml“,new XMLContentHandler());

這裡的XMLContentHandler 繼承 DefaultHandler

  SAX 代碼例子

public class XMLContentHandler extends DefaultHandler{
    //當前元素中的數據
    private String currentData;
    //取得元素數據
    public void characters(char[] ch, int start, int length)
    throws SAXException {
        currentData=new String(ch,start,length);
    }
     //在解析整個文檔結束時調用
    public void endDocument() throws SAXException {
        System.out.println("結束文檔");
    }
     //在解析元素結束時調用
    public void endElement(String uri, String localName, String name)
    throws SAXException {
        System.out.println("節點數據 *************************"+this.currentData);
        System.out.println("結束元素 ************"+name);
    }

    //在解析整個文檔開始時調用
    public void startDocument() throws SAXException {
         System.out.println("開始文檔");
    }

    //在解析元素開始時調用
    public void startElement(String uri, String localName, String name,
    Attributes attributes) throws SAXException {
        System.out.println("開始元素 ************"+name);
    }
}
           

  DOM解析和SAX解析總結:

 

通過dom.xml的文件畫圖解析DOM和SAX的關係

 

首先DOM解析XML也是在記憶體中形成一個樹狀結構。

DOM解析:把整個XML文檔先載入到記憶體中,形成樹狀結構。

  缺點:如果文檔非常大,載入到記憶體中容易產生記憶體溢出的問題。

  優點:因為節點與節點之間有關係,進行增刪改非常方便。

SAX解析:基於事件驅動的,邊讀邊解析。

  缺點:不能進行增刪改的操作。

  優點:文檔大也不會有記憶體溢出的問題,查找非常方便。

DOM4J解析XML文檔:

Dom4j是一個簡單、靈活的開放源代碼的庫。Dom4j是由早期開發JDOM的人分離出來而後獨立開發的。與JDOM不同的是,dom4j使用介面和抽象基類,雖然Dom4j的API相對要複雜一些,但它提供了比JDOM更好的靈活性。

Dom4j是一個非常優秀的Java XML API,具有性能優異、功能強大和極易使用的特點。現在很多軟體採用的Dom4j,例如Hibernate,包括sun公司自己的JAXM也用了Dom4j。

使用Dom4j開發,需下載dom4j相應的jar文件。

Document對象

DOM4j中,獲得Document對象的方式有三種:

1.讀取XML文件,獲得document對象            

  SAXReader reader = new SAXReader();             

  Document   document = reader.read(new File("input.xml"));

2.解析XML形式的文本,得到document對象.             

  String text = "<members></members>";             

  Document document = DocumentHelper.parseText(text);

3.主動創建document對象.             

  Document document = DocumentHelper.createDocument();            

  //創建根節點

  Element root = document.addElement("members");

節點對象

1.獲取文檔的根節點.

  Element root = document.getRootElement();

2.取得某個節點的子節點.

  Element element=node.element(“書名");

3.取得節點的文字

  String text=node.getText();

4.取得某節點下所有名為“member”的子節點,併進行遍歷.

  List nodes = rootElm.elements("member");

  for (Iterator it = nodes.iterator(); it.hasNext();) {

       Element elm = (Element) it.next();    

    // do something }

5.對某節點下的所有子節點進行遍歷.

   for(Iterator it=root.elementIterator();it.hasNext();){       

    Element element = (Element) it.next();       

    // do something    }

6.在某節點下添加子節點.

   Element ageElm = newMemberElm.addElement("age");

7.設置節點文字.

  element.setText("29");

8.刪除某節點.

  //childElm是待刪除的節點,parentElm是其父節點

  parentElm.remove(childElm);

9.添加一個CDATA節點.

  Element contentElm = infoElm.addElement("content");

  contentElm.addCDATA(diary.getContent());

節點對象屬性

1.取得某節點下的某屬性   

   Element root=document.getRootElement();        

  //屬性名name Attribute attribute=root.attribute("size");

2.取得屬性的文字    

  String text=attribute.getText();

3.刪除某屬性

  Attribute attribute=root.attribute("size");

  root.remove(attribute);

4.遍歷某節點的所有屬性   

  Element root=document.getRootElement();      

  for(Iterator it=root.attributeIterator();it.hasNext();){         

    Attribute attribute = (Attribute) it.next();         

    String text=attribute.getText();         

    System.out.println(text);    }

5.設置某節點的屬性和文字.

  newMemberElm.addAttribute("name", "sitinspring");

6.設置屬性的文字

  Attribute attribute=root.attribute("name");   

  attribute.setText("sitinspring");

將文檔寫入XML文件

1.文檔中全為英文,不設置編碼,直接寫入的形式.

   XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));

   writer.write(document);

   writer.close();

2.文檔中含有中文,設置編碼格式寫入的形式.

   OutputFormat format = OutputFormat.createPrettyPrint();

  // 指定XML編碼                  

  format.setEncoding("GBK");       

   XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);

   writer.write(document);

   writer.close();

Dom4j在指定位置插入節點

1.得到插入位置的節點列表(list)

2.調用list.add(index,elemnent),由index決定element的插入位置。

  Element元素可以通過DocumentHelper對象得到。示例代碼:

  Element aaa = DocumentHelper.createElement("aaa");

  aaa.setText("aaa");

  List list = root.element("書").elements();

  list.add(1, aaa);

  //更新document

字元串與XML的轉換

1.將字元串轉化為XML

  String text = "<members> <member>sitinspring</member></members>";

  Document document = DocumentHelper.parseText(text);

2.將文檔或節點的XML轉化為字元串.

  SAXReader reader = new SAXReader();

   Document   document = reader.read(new File("input.xml"));            

  Element root=document.getRootElement();                 

  String docXmlText=document.asXML();

  String rootXmlText=root.asXML();

  Element memberElm=root.element("member");

   String memberXmlText=memberElm.asXML();

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Atitit。木馬病毒原理機密與概論以及防禦 1. 定時截屏木馬1 1.1. QQ聊天與微信聊天木馬1 2. 文檔木馬1 3. 病毒木馬的觸發方式2 4. 遠程木馬2 5. 漏洞木馬2 6. 病毒木馬的隱藏機制2 7. 自我複製技術3 8. 木馬病毒的免殺3 9. 其他木馬病毒3 9.1. Gui接 ...
  • ''' list ''''''name=[1,2,3,4]print(name[0])#第一個print(name[:]) #全部#print(name[1:3]) #切片#print(name[-3:-1])#倒取值print(name[-2:-1])#[頭:尾] 顧頭不顧尾print(name[ ...
  • 又是在學數據結構的時候,發現了之前學習的知識遺忘很多,在發現對C/C++中關鍵字typedef的理解還是沒有到位後,我翻閱了學C++用到的課本,又問了度娘,也看了不少關於typedef用法的博客。於是我就想把我理解的東西整理下來。 一.基本解釋 typedef為C語言的關鍵字,作用是為一種數據類型定 ...
  • 這段時間看的部分感覺沒啥需要記錄下來的,個人也沒什麼想法,不過以後還是要多記,多寫 這個main方法是永遠不停的,其餘兩個從兩個不同的角度給出了同步的方法 總之:當多個線程共用可變數據的時候,每個讀或者寫數據的線程都必須執行同步。 ...
  • 每天一個設計模式-1 簡單工廠 1.簡單工廠的定義 提供一個創建對象實例的功能,而無須關心其具體實現(核心)。 雖然不能讓模塊外部知道模塊內部的具體實現,但模塊內部是可以知道具體實現類的。乾脆在模塊內部建一個類,用這個類來創建介面,然後把創建號的介面返回給客戶端;這樣,外部應用就只需要根據這個類來獲 ...
  • Atitit Atitit.軟體相容性原理 API相容 Qa7 1. 相容性的重要性與反面教材1 2. 提升相容性的原則2 2.1. What 與how 分離2 2.2. 老人老辦法,新人新辦法,只新增,少修改,莫刪除3 2.3. 計劃趕不上變化,永遠api修改也不可能整齊劃一,反而帶來不相容的風險 ...
  • 回到目錄 對於IoC容器來說,性能最好的莫過於Autofac了,而對於靈活度來說,它也是值得稱贊的,為了考慮系統的性能,我們經常是在系統初始化於將所有依賴註冊到容器里,當需要於根據別名把實現拿出來,然後再使用即可;而如果每次使用都是註冊-反射,我相信那是很耗性能的,所以我們決定先依賴一次註冊,按需反 ...
  • SpringBootService,這是一個spring boot微服務的框架,包括redis,mq,restful,定時器,mybatis。易擴容、易維護的架構。 項目說明 該項目使用maven進行管理,可直接在maven projects下Plugins的spring-boot中運行.切記勿忘數 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...