標籤:
XML語言(可延伸標記語言 (XML)W3C):描述一系列有關係的資料,允許自訂標籤,它常用作軟體設定檔,以描述程式模組之間的關係。
- XML文法:文檔聲明,元素,注釋(DATA區,特殊字元,處理指示(processing instruction))
- 文檔聲明:聲明文檔的類型
- 例如:<?xml version="1.0"?> <?xml version = "1.0" encoding = "gb2312" ?>
- 亂碼問題:瀏覽器預設為GB2312格式來解析,而文字文件儲存成了UTF-8格式,則會出現亂碼。
- 元素:XML檔案中出現的標籤
- 可以嵌套,但是不能交叉嵌套
- 可以帶主體的標籤<a>...</a>,也可以不帶主體的<a />
- 必有且僅有一個根標籤
- 標籤中的換行和空格都是原始檔案,不能格式混亂
- 標籤規範:不能以數字和"_"開頭,不能以xml(Xml或XML)開頭,不能有空格,中間不含":"
- 屬性:
- 屬性值一定用"雙引"或"單引"引起來
- 可以使用子標籤,例如<input><name>...</name>
- 注釋:<!-- -->聲明之前不能有注釋,不能有嵌套注釋。
- CDATA區:內容解析引擎不會解析內容,原封不動輸出。<用於程式>
<![CDATA[內容]]> 例:<![CDATA[...<><>...]]>
& --> & < --> < > --> > " --> " ‘ -->'
-
- 處理指示(PI):處理指示用來指揮解析引擎如何解析XML文檔內容。例:<?xml-stylesheet type="text/css" href="1.css" ?>聲明語句也是處理指示。
- XML約束:架構的作者需要約束設定檔的編寫格式
- DTD約束技術:Document Type Definition文件類型定義
<?xml version="1.0" ?> //XML檔案<!DOCTYPE 書架 SYSTEM "book.dtd"><書架> <書> <書名>Java ...</書名> <作者>張孝祥</作者> <售價>39.00元</售價> </書> <書> ... </書></書架>
<!ELEMENT 書架 (書+> //+表示一本或多本 <!ELEMENT 書 (書名,作者,售價)> <!ELEMENT 書名 (#PCDATA)> <!ELEMENT 作者 (#PCDATA)> <!ELEMENT 售價 (#PCDATA)>
-
-
- DTD檔案應使用UTF-8或Unicode編碼,若不符合DTD規則,在瀏覽器下開啟XML也能通過,所以應該使用Eclipse來校正。
- DTD約束有兩種形式,可以寫在xml中,也可以單獨一個檔案。
- XML檔案使用DOCTYPE聲明語句來指明它所遵循的DTD檔案。
- <!DOCTYPE 文檔根節點 SYSTEM "DTD檔案的URL">
- <!DOCTYPE 文檔根節點 PUBLIC "DTD名稱" "DTD檔案的URL"> 引用的是公用檔案。例如:
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems.Inc. //DTD ...." "http://java.sun.com/dtd/web_app_2_3.dtd">
-
- DTD約束文法細節:(元素定義,屬性定義,實體定義)
- 元素定義:在DTD文檔中使用ELEMENT聲明一個XML元素,文法為<!ELEMENT 元素名稱 元素類型>
- 元素類型可以是元素內容或類型,如<!ELEMENT 書架(書名,作者,售價)> 和 <!ELEMENT 書名 (#PCDATA)> --> 元素內容需要用()括起來。EMPTY->用於定義空元素,ANY為任意類型->元素類型可以直接寫。
- 元素內容的組成關係:用逗號分隔,表示出現順序要一致;用"|"分隔,表示任選其一,只能出現其中一個。元素內容可以出現"+",表示一次或多次,"?"表示0次或一次,"*"表示0次或多次。
- 屬性定義:XML文檔中的標籤需要通過ATTLIST為其設定屬性。
<!ATTLIST 元素名 屬性名稱1 屬性值類型 設定說明 ....... >如:<!ATTLIST 商品 類別 CDATA(相當於String) #REQUIRED(必須設定的屬性) 顏色 CDATA(相當於String) #IMPLIED(可選屬性)>
-
-
-
- 設定說明:#REQUIRED為必須設定該屬性,#IMPLIED可以設定也可以不設定,#FIXED取值固定一個值,但是要提供這個值,並且直接使用預設值,可以預設也可以修改。例:
<!ATTLIST 頁面作者 姓名 CDATA #IMPLIED 年齡 CDATA #IMPLIED 聯絡資訊 CDATA #REQUIRED 網站職務 CDATA #FIXED "頁面作者" //預設值可以不寫 個人愛好 CDATA "上網" //預設值可以不寫>
-
-
-
- 屬性值類型:CDATA --> 普通文本字串 ENUMERATED --> 枚舉(雞肉|豬肉|牛肉) ID --> 標籤的唯一標識,只能由字母開頭,不能出現空格ENTITY(實體) --> 建立一段內容的別名
- ENTITY定義文法:<!ENTITY 實體名稱 "實體內容">,以&實體名稱 --> 實體內容方式在XML中引用。例如
<!ENTITY copyright "I am a programmer"> //在XML中使用©right;來引用<!ENTITY %實體名稱 "實體內容"> //以%實體名稱; --> 實體內容方式引用<!ENTITY %TAG_NAMES "姓名|E-MAILS|電話|地址"><!ELEMENT 個人資訊 (%TAG_NAMES;|生日)><!ELEMENT 客戶資訊 (%TAG_NAMES;|公司名)>
- XML編程(CRUD 增刪改查):
- XML解析方式:dom和sax
- DOM(document object model):記憶體消耗較大,但是增刪改查很容易。特點:標籤,文本,屬性皆是對象。
- SAX(simple API for XML) :不是官方標準,但廣泛使用sax。特點:讀一行解析一行,記憶體消耗小,不適合增刪改查。
- XML解析開發包:Jaxp(sun),Jdom,dom4j。其中,dom4j最好用。
- Jaxp:是J2SE的一部分,由javax.xml,org.w3c.dom,org.xml.sax包及子包組成。在javax.xml.parsers包中,定義了幾個工廠類,程式員調用工廠類可以得到xml文檔的DOM解析器和SAX解析器,從而實現了XML的解析。
- 實現:DocumentBuilderFactory抽象類別調用newInstance方法擷取工廠對象,在調用對象中的parse方法,返回一個DOM的Document對象,在用Document對象,實現XML文檔的增刪改查。
- 代碼:
Document doc = builder.parse("src/book.xml");NodeList list = doc. getElementByTagName("書名");Node node = list.item(1);String content = node.getTextContent();
增刪改查都可以參照API,Document,Node,Element,transform等完成。
-
- Sax解析:採用事件處理的方式解析XML檔案,涉及解析器和事件處理器
- 解析器可以使用Jaxp的API建立,建立出SAX解析器去解析某個XML文檔。
- 解析器採用SAX方式解析某個XML文檔時,只要解析到XML文檔的組成部分,就會去調用時間處理器的方法,並把內容傳給時間處理器(參數傳遞)。
- 通過事件處理器的參數,可以獲得解析後的資料,從而決定後續的操作。(事件處理器由程式員編寫)
- 流程:SAXPARSERFactory --> SaxParser --> SaxReader -->Content Handle(傳入XML文檔) --> 事件處理器。事件處理器的編寫可以查看API,Content Handle可以利用DefaultHandler繼承,並覆蓋start,character,end方法即可。
- javabean封裝xml文檔資料:
- 先建立javabean類,再重寫DefaultHandler的start,character,end方法,以標籤為條件判斷,存入List中。注意在標籤結束時,應清空記錄的標籤,否則在標籤結束時,跳入空行中間欄位,拋出null 指標異常。
- Dom4j解析:(Hibernate就是使用dom4j解析設定檔):
- 首先在Jre中匯入dom4j的jar包<注意其檔案中的jar包和支援jar包都要匯入>。可以查看Dom4j的文檔,可以快速瞭解dom4j的編程。
- 亂碼問題:儲存資料如果有亂碼問題,可以初步判斷是IO流的問題,使用OutputStream(File,charset)來選擇合適的編碼方式。而XMLWriter.write採用UTF-8的方式寫XML檔案,所以若需要寫XML檔案以GB2312方式,需要定義format輸出器。建議用位元組流,因為如果用字元流,是由字元流來查碼錶。若用位元組流,則是由XMLWriter來查碼錶。
- 增刪改查:
- <Create>得到Root節點,再一次往下找要增加標籤的父標籤,若要加入標籤到序列中,需要得到父標籤的子標籤集合{List=element();},再調用List的add方法插入至指定位置。
- <Delete>從根節點向下,指到要刪除的結點,再找到父標籤,調用remove方法。
- <Update>從根節點向下找到目的節點,調用setText()方法。
- XPath:快速定位XML資料 <XPATH TUTORIAL>文檔
- 文法:單斜杠:從根項目開始寫;雙斜杠:從絕對路徑開始 //* //BBB[屬性] --> 插文檔
- 代碼:
SAXReader reader = new SAXReader();Document doc = reader.read(new File("...."));doc.selectSingleNode("//作者"); //擷取單個結點doc.selectNodes("..."); //擷取所有結點
Node node = document.selectSingleNode("//user[@username=‘"+password+"‘ and @password=‘"+password+"‘]");if(node == null){ system.out.println("使用者名稱密碼錯誤");}else{ ....}
-
- Schema約束:
- 特性:
- Schema符合XML文法結構(用XML約束XML)。
- 可以使用Dom4j等解析Schema(因為Schema本身就是個XML)
- Schema專屬命名空間。Schema比DTD支援更多的資料類型,約束功能更強。
- 不能定義實體,且比DTD複雜。已成為W3C標準。
- 尾碼名.xsd,一個Schema文檔通常稱之為模式文檔,遵循文檔的XML檔案稱為執行個體文檔。
- XML Schema必須有根節點,並且一定是Schema名稱。
- 在編寫Schema文檔後,需要將文檔中聲明的元素繫結到URI上,即把XML Schema文檔聲明的元素繫結到一個命名空間上,以便以後解析引擎找到解析方法。
- 名稱空間:在Schema中,每個約束模式文檔都可以被賦予一個唯一的名稱空間,在XML書寫標籤時,可以通過名稱空間聲明(xmlns)來表明當前編寫的標籤來自哪個Schema文檔。
<itcast:書架 xmlns:itcast="http://www.itcast.cn"> <itcast:書>....</itcast></itcast:書架>
-
-
-
- 為了找到具體檔案的位置,需指定SchemaLocation屬性。例:
<itcast:書架 xmlns:itcast="http://www.itcast.cn"xmlns:xsi="http://www.w3c.org/2001/XMLSchema-instance"xsi:schemalocation="http://www.itcast.cn book.xsd">
-
-
-
- 使用預設的名稱空間:xmlns="URI"。例如:
<書架 xmlns="www.itcast.cn" > //指定了一個預設的名稱空間 ...... ...... <書>....</書></書架>
-
-
-
- 使用名稱空間引入多個XML Schema文檔:多寫一行xmlns,多謝一個SchemaLocation,可以使用兩種約束文檔。
- 不使用名稱空間:<書架 xml:xsi=.... xsi:noNameSpaceSchemaLocation="xmlBook.xsd">
- Schema文法:查看w3c文檔
Java WEB —— XML