XML
一概述
eXtensible Markup Language,不以預先定義的一組資料結構為前提,用作應用程式間資料交換的載體。XML沒有規定固定的标簽與固定的結構,使用者可以自定義,可擴充性強,這一點不同于HTML語言,HTML規定了可使用的标簽以及标簽之間的關系,擴充性差。
使用XML語言編寫的文檔主要用作應用程式間資料交換的載體,一個應用程式将傳遞給另一個應用程式的資料以XML語言編寫,接收一方的應用程式根據XML語言的規則讀取。
⑴序言:XML聲明、處理指令與注釋。
①文檔元素一般指文檔标簽。
②XML文檔元素以樹形分層結構排列。
③XML文檔中隻能有一個頂層元素,這個頂層元素叫做根元素。
④文檔元素必須有起始标記與結束标記,兩種形式:<tagName>xxxxx</tagName與<tagName xxxx/>。
元素屬性依附于元素,必須通過元素調用,隻能出現在起始标簽中,其值用單引号或者雙引号括起來。
注釋格式:<!--xxxx-->
一種流行的讀寫XML文檔的開源元件,導入架包就可使用。
二特殊字元的處理
一些字元是标簽的一部分,當出現在元素内容中時會被XML文檔解析器視作标簽而不是普通字元,這是就會出錯誤,為了避免這種情況的出現,使用一些特殊方式來處理這些歧義字元。
用其他字元替換歧義字元。
歧義字元 用作替換的字元
< &lt;
> &gt;
& &amp;
' &apos
" &quot
①一種标記法,在可能出現歧義的字元前放一個标記,當系統接觸到标記,就按照預先定義的處理方式把标記中的字元當做普通字元。
②文法格式:<![CDATA[content]]>。
③在XML中使用正規表達式必須使用CDATA字段。
三幾個重要類
1. Node(Interface)
|
|
|----------------------------------------------------------------------------|
| | |
Branch(Interface) Comment(Interface) Attribute(Interface)
|
Element(Interface)
用來将建立的XML文檔輸出到文檔中,一個裝飾類,裝飾了Writer或者OutputStream。
⑴如果裝飾了字元流,為了防止輸出到文檔中的中文出現亂碼,編碼方式必須設為GBK。
⑵如果裝飾了位元組流,為了防止輸出到文檔中的中文出現亂碼,編碼方式必須可設為UTF-8。
XML文檔對象建立類,基于硬碟上的文檔建立封裝了文檔全部資訊的對象。
四建立XML文檔
使用文檔對象建立的節點即為根節點:
⑴element.setText(content):添加普通内容。
⑵element.addCDATA(content):添加CDATA字段。
預設情況下,XML文檔采用緊湊方式排版,閱讀不友善,可以将輸出格式改為縮進方式:
⑴未設定輸出樣式時輸出:
⑵設定了輸出樣式時輸出:
⑶輸出到頁面:
⑷輸出到控制台:
五解析文檔
DOM4J:一次性将檔案讀取到記憶體,讀取速度快,用于讀取較小的檔案,不适宜讀取較大的檔案。
SAX:邊讀邊解析,适用于讀取較大的檔案。
子節點指定的是一級目錄下的節點,不包括二級目錄及以下目錄中的節點。
⑴root.element(name):擷取具有指定名稱的節點,如果文檔中包含多個,則傳回第一個。
⑵root.elements(name):以List集合傳回具有指定名稱的全部節點。
XPath是一種根據路徑擷取xml文檔節點的語言。
基本文法格式:selectNode(String xpath)/selectSingleNode(String xpath)。
nodeName:擷取具有指定名稱的全部子節點。
/root/xxxx:以相對于根節點的路徑擷取節點。
xxxx/xxxx:以相對于操作對象的路徑擷取節點。
//nodeName:不受路徑限制,擷取文檔中指定名稱的全部節點。
A//nodeName:擷取A節點下具有指定名稱的全部後代節點。
A/nodeName[1]:擷取子節中的第一個節點。
A/nodeName[last()]:擷取子節點中最後一個節點。
//nodeName[@attr]:不受路徑限制,擷取文檔中具有指定名稱與指定屬性的全部節點。
//nodeName[@attr=‘xxx’]:不受路徑限制,擷取文檔中具有指定名稱與指定屬性值的全部節點。
//nodeName[@attr+關系運算符xxxxx]:不受路徑限制,擷取文檔中具有指定名稱、同時滿足關系運算的全部節點。
首先擷取疊代器Iterator,該疊代器包含了具有指定名稱的全部子節點:
⑴删除單個節點:
①parentNode.remove(subNode):由父節點删除。
②element.detach():自己删除自己。
⑵删除具有指定名稱的全部節點:parentNode.elements(name).clear();
element.setName("newName"),修改節點名稱。
⑴Attribute attr=element.attribute(String name):擷取指定名稱的屬性。
⑵Attribute attr=element.attribute(int index):擷取指定索引的屬性,index從0開始。
⑶String value=attr.getValue():擷取屬性值。
⑷String value=element.attributeValue(name):直接根據屬性名擷取屬性值。
⑸List<Node> attributes = doc.selectNodes("//@count"):不受路徑限制,擷取文檔中具有指定名稱的全部屬性。
⑴attr.detach():自己删除自己。
⑵element.remove(attr):通過節點删除屬性。
⑴節點的内容指的是起始标簽之間未被其他标簽包含的文本,包含空格,是以才有了去除空格的方法getTextTrim。
⑵element.getText():擷取内容,未删除前後可能存在的空格。
⑶element.getTextTrim():擷取删除前後空格的内容。