eXtensible Markup Language 可擴大標記語 言——由 W3C 組織發 布,目前推薦遵照的是 W3C 組織于 2000 年發 布的 XML1.0 規范。
XML 的使命,就是以1 個統1的格式,組織有 關系的數據,為不同平 臺下的利用程序服務。
<?xml version="1.0" encoding="utf⑻"?>
<中國>
<北京>
<海淀></海淀>
<豐臺></豐臺>
</北京>
<湖南>
<長沙></長沙>
<岳陽></岳陽>
</湖南>
<湖北>
<武漢></武漢>
<荊州></荊州>
</湖北>
</中國>
主要用處
配置文件
JavaWeb
框架 數據交換
Ajax WebService
數據存儲
保存關系型數據
文檔結構
文檔聲明
①在編寫 XML 文檔時,必須在文件的第1行書寫文檔聲明。 最簡單的聲明語法:<?xml version="1.0" ?>
②用 encoding 屬性說明讀取文檔所用的解碼的字符集:
<?xml version="1.0" encoding="GB2312" ?>
這樣就要求保存文件時,必須用 GB2312 編碼保存。此時要求 XML 文檔的作者確 認當前編輯器保存文檔的編碼方式。
eclipse 會自動依照解碼字符集進行編碼保存 記事本需要另存為指定的字符集
語法規則
①第1行動 XML 聲明,且必須頂格寫
②只能有1個根標簽
③標簽必須正確結束
④標簽不能交叉嵌套
⑤嚴格辨別大小寫
⑥屬性必須有值,且必須加引號
⑦標簽不能以數字開頭
轉義字符
特殊字符 | 替換符號 |
< | < |
> | > |
& | & |
“ | " |
‘ | ' |
CDATA 區
①當 XML 文檔中需要寫1些程序代碼、SQL 語句或其他不希望 XML 解析器進行 解析的內容時,就能夠寫在 CDATA 區中
②XML 解析器會將 CDATA 區中的內容原封不動的輸出
③CDATA 區的定義格式:<![CDATA[?]]> 例如:
注釋
①Xml 文件中的注釋采?。骸?lt;!--注釋-->” 格式。注意:
●XML 聲明之前不能有注釋
●注釋不能嵌套
處理指令
①處理指令,簡稱 PI (processing instruction)。處理指令用來指揮解析引擎如何解析 XML 文檔內容。
②處理指令必須以“<?”作為開頭,以“?>”作為結尾,XML 聲明語句就是最常 見的1種處理指令。
例如,在 XML 文檔中可使用 xml-stylesheet 指令,通知 XML 解析引擎,利用 css
文件顯示 xml 文檔內容。
<?xml-stylesheet type="text/css" href="p.css"?>
解析方式
dom:(Document Object Model, 即文檔對象模型) 是 W3C 組織推薦的處理
XML 的1種方式。 它下面有兩個分支:jDom 與 dom4j
它們可都可以對 xml 文件進行增刪改查的操作
sax: (Simple API for XML) 不是官方標準,但它是 XML 社區事實上的標準, 幾近所有的 XML 解析器都支持它。
只能進行解析(查詢)
pull: Pull 解析和 Sax 解析很類似,都是輕量級的解析,它是1個第3方開 源的 Java 項目,但在 Android 的內核中已嵌入了 Pull 。 只能進行解析(查詢)
解析技術體系
DOM 解析
1. DOM 中對象接口關系圖
l Node:xml 文件所有對象的根接口 節點
l Document:代表 xml 文件的全部內容的對象的接口
l Element:代表某個元素或標簽的對象的接口
l Attr:代表某個元素的某個屬性對象的接口
l Text:代表標簽體文本標簽本對象的接口
l NodeList:代表包括多個 Node 接口對象的集合對象
2.主要方法概覽
Node | appendChild(newChild) | 將新的節點添加為最后1個子節點 |
| insertBefore(newChild,refChild) | 在某個子節點前插入1個新子節點 |
| removeChild(oldChild) | 刪除指定的某個子節點 |
| replaceChild(newChild,oldChild) | 將指定的子節點替換成新的子節點 |
| setTextContent(textContent) | 設置文本內容(1般用在元素對象上) |
| getNodeName() | 得到節點名稱(1般用在元素對象上) |
| getParentNode() | 得到父節點(1般用在元素對象上) |
| getTextContent() | 得到文本內容(1般用在元素對象上) |
| getFirstChild() | 得到第1個子節點 |
| getLastChild() | 得到最后1個子節點 |
| getNextSibling() | 得到下1個兄弟節點 |
| getPreviousSibling() | 得到上1個兄弟節點 |
Document | createElement(name) | 創建1個指定名稱的標簽對象返回 |
| getDocumentElement ()//getRootElement() | 得到文檔的根元素對象 |
| getElementById(id) | 根據子元素的 id 屬性找到對應的子元素 |
| getElementsByTagName(name) | 根據標簽名得到對應的子標簽的集合 |
Element |
|
|
| setAttribute(name, value) | 設置元素的屬性名和屬性值 |
| removeAttribute(attrName) | 根據屬性名刪除對應的屬性 |
| getAttribute(attrName) | 根據屬性名得到對應的屬性 |
| getElementsByTagName(name) | 根據標簽名得到對應的子標簽的集合 |
| getTagName() | 得到標簽名 |
Attr、Text | 極少直接操作這兩個接口的對象,1般通過 Element 對象來操作 | |
NodeList | getLength()得到包括的節點對象的個數 item(index)根據下標得到某個節點 |
3.demo
讀取 id 為 008 的員工的年齡
4.提示:獲得解析器對象
javax.xml.parsers 包中的 DocumentBuilder 類用于加載 xml 文件,并產生1個 Document 對象
//創建1個 xml 文檔解析器工廠對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//通過工廠創建1個 xml 文檔解析器對象
DocumentBuilder builder = factory.newDocumentBuilder();
//通過解析器對象解析1個文件對象得到 Document 對象
Document document = builder.parse(new File("d:/users.xml"));
XML dom4j解析
1.Dom4j 是1個簡單、靈活的開放源代碼的庫。Dom4j 是由初期開發 JDOM 的人分離出來而 后獨立開發的。與 JDOM 不同的是,dom4j 使用接口和抽象基類,雖然 Dom4j 的 API 相對要 復雜1些,但它提供了比 JDOM 更好的靈活性。
2.Dom4j 是1個非常優秀的 Java XMLAPI,具有性能優良、功能強大和極易使用的特點?,F 在很多軟件采取的 Dom4j,例如 Hibernate。使用Dom4j 開發,需下載 dom4j 相應的 jar 文 件。
3.獲得 Document 對象
SAXReader reader = new SAXReader();
Document document= reader.read(new File( "input.xml“ ));
4.元素操作
? //獲得文檔的元素.
Element root = document.getRootElement();
? //獲得某個元素的指定名稱的第1個子節點
Element element = element.element(“書名");
? //獲得某個元素的指定名稱的所有子元素的集合
List list = element.elements(“書名”);
? //添加1個指定名稱的子元素
Element childEle =parentEle.addElement(“書名”);
? //刪除某個元素指定的子元素 parentEle.remove(childEle);
5.屬性操作
? //獲得某個元素的指定名稱的屬性對象
Attribute attr = element.attribute(“id”);
? //獲得某個元素的指定名稱的屬性值
String id =element.attributeValue(“id”);
? //給元素添加屬性或更新其值
Attribute attr =element.addAttribute(“id”,”123”);
? //刪除某個元素的指定屬性 element.remove(attribute);
6.文本操作
? //獲得某個元素的文本內容 String text = element.getText();
? //給某個元素添加或更新文本內容
element.setText(“Tom”);
7.將文檔寫入 XML 文件,使更改生效
OutputFormat format = OutputFormat.createPrettyPrint();
XMLWriter writer = newXMLWriter( newFileOutput( "output.xml“),format);
writer.write(document); writer.close();
XPath解析
1. XPath 是在 XML 文檔中查找信息的語言 XPath 是通過元素和屬性進行查找 XPath 簡化了 Dom4j 查找節點的進程 使用 XPath 必須導入 jaxen⑴.1-beta⑹.jar
否則出現
NoClassDefFoundError: org/jaxen/JaxenException 2.XPath 語法示例
/employeers/employeer | 從根元素開始逐層找,以”/”開頭 |
//name | 直接獲得所有 name 元素對象,以“//”開頭 |
//employeer/* | 獲得所有employeer元素
元素的所有子元素對象 |
//employeer[1]或 //employeer[last()] | 獲得所有 employeer 元素的第1個或最后1個 |
//employeer[@id] | 獲得所有帶 id 屬性的 employeer 元素對象 |
//employeer[@id=‘002'] | 獲得 id 等于 002 的 employeer 元素對象 |
3.查詢節點
? 獲得所有符合條件的節點
– document.selectNodes(String xpathExpression) 返回 List 集合
? 獲得符合條件的單個節點
– document.selectSingleNode(String xpathExpression)
– 返回1個 Node 對象。如果符合條件的節點有多個,那末返回第1個。
XML SAX 解析
1. 為何會出現 SAX 解析?
在使用 DOM 解析 XML 文檔時,需要讀取全部 XML 文檔,在內存中構架代表全部 DOM 樹的 Doucment 對象,從而再對 XML 文檔進行操作。此種情況下,如果 XML 文檔特 別大,就會消耗計算機的大量內存,并且容易致使內存溢出。
SAX 解析允許在讀取文檔的時候,即對文檔進行處理,而沒必要等到全部文檔裝載完才會文檔進行操作。
注意:sax 只能用于讀取 xml 文件,沒法作更新
2. SAX 采取事件處理的方式解析 XML 文件,利用 SAX 解析 XML 文檔,觸及兩個部份:解 析器和事件處理器(對象):
解析器可使用 JAXP 的 API 創建,創建出 SAX 解析器后,就能夠指定解析器去解析某 個 XML 文檔。
解析器采取 SAX 方式在解析某個 XML 文檔時,它只要解析到 XML 文檔的1個組成部份,都會去調用事件處理器的1個方法,解析器在調用事件處理器的方法時,會把當前解析到的 xml 文件內容作為方法的參數傳遞給事件處理器。
事件處理器由程序員編寫,程序員通過事件處理器中方法的參數,就能夠很輕松地得到
sax 解析器解析到的數據,從而可以決定如何對數據進行處理。
3.解析方式
? 使用 SAXParserFactory 創建 SAX 解析工廠
SAXParserFactory factory = SAXParserFactory.newInstance();
? 通過 SAX 解析工廠得到解析器對象
SAXParser sp = factory.newSAXParser();
? 通過解析器對象得到1個 XML 的讀取器
XMLReader xmlReader = sp.getXMLReader();
? 設置讀取器的事件處理器
—————————————————————————————
xmlReader.setContentHandler(new BookParserHandler());
? 解析 xml 文件
xmlReader.parse("book.xml");
XML Pull 解析
1. 為何會出現 PULL 解析?
Pull 解析與 sax 解析類似都是基于事件方法回調機制來實現對 xml 文件解析。
Sax 解析不足:即便已找到所要的數據,xml 數據還是會全部加載進來并產生方法調 用。程序員沒法停止這些無用的操作,而 pull 解析解決了此問題。
Pull 解析:加載每部份數據產生方法調用,都必須通進程序員調用1個固定的方法才 能進行下去,否則解析工作就停止了。Next()
注意:pull 解析也只能用于讀取 xml 文件,沒法作更新
2. Pull 解析依賴兩個 jar 包:xmlpull_1_0_5.jar 和 kxml2⑵.3.0.jar 3.經常使用接口或類
XmlPullParserFactory XmlPullParser(既是解析器又是數據的存儲器)XmlPullParserException
關于XML的總結自己感覺也是很成心思的,雖然經歷了痛苦演變的整理進程,以后還是很有收獲的。
作為1種可擴大的標記語言,項目中我們還是常常遇到的,所以呢,不能不學習明白哦。對XML的使用,是我們最為關注的,拋磚引玉吧,寫了1些小的demo,希望我們都可以做的更好!
上一篇 第12章Swing編程
下一篇 Java之IO操作總結