1. 程式人生 > >XML解析方法詳解

XML解析方法詳解

自動化測試 性能測試。 xml xml解析 軟件測試

今日目標:DOM、 SAX、 STAX、 XML解析API

今日重點:JAXP DOM解析 、JAXP SAX解析、XML PULL解析。

XML現在已成為一種通用的數據交換格式,平臺的無關性使得很多場合都需要用到XML。深入了解前端知識更能充分解決自動化的異常類問題。

一、

1、XML有三種解析方式:DOM SAX STAX

2、XML的作用(企業應用):存儲數據、配置文件、傳輸數據。

存儲和傳輸數據經常一起使用,XML數據通常由程序生成的,用程序解析XML(XML一般不加約束)

配置文件單獨使用(通常會加約束)

3、DOM

全稱為:Document Object Model文檔對象模型。

DOM的解析思想 :將整個XML數據讀取到內存中,在內存中形成文檔樹形結構,

對內存中文檔樹形結構進行操作。

優點:API簡單。因為一次性加載整個文檔,文檔所有數據都在內存中,所以簡便易用 處理

較方便。可頻繁修改XML文件內容(即可回寫)。

缺點:需將整個XML文檔加載到內存,消耗系統資源。速度較慢。當XML文檔過大時,會導致

無法全部加載進內存,內存溢出問題。

**DOM是官方提供的XML解析標準,由W3C制定 。

4、SAX

全稱為:Simple API for XMl簡單XML解析API。

SAX解析思想:為解析器綁定回調程序Handler , 解析器讀取xml文件,觸發相應事件,

自動調用handler中對應事件方法

優點:SAX是輕量級的接口,解析速度快,無須占用太多內存資源。

缺點:SAX每次都要從頭到尾遍歷節點,修改不易實現。編程復雜,如在內存中不保留讀取的數據,將無法回寫。

註:如果SAX、STAX在內存中邊讀邊保存數據的話 ,就類似於DOM了。

**SAX是民間XML解析標準,來自XML社區。

**采用“推”模式,PUSH。

5、STAX

全稱是:Streaming API for XML ,XML解析流API。

STAX解析思想 :提高SAX模式解析效率。亦為邊讀邊處理。

**采用“拉”模式,PULL。

*****以上三種解析方式:性能比較::STAX >SAX >DOM

6、什麽是推模式?什麽是拉模式?

PUSH:是以服務器為主,控制操作流程模式。

當你將文檔和處理程序 交給解析器,解析器自動進行解析,調用相應事件處理方法 (該過程不由你自己控制)。

服務器主動向客戶端發送信息,發送過程中客戶端不能幹預 。

PULL:是以客戶端為主,控制操作流程模式。


********

JAXP:

全稱是Java API for XML Processing。

它是一套API。DOM、SAX、STAX只是XML的解析思想。JAXP是DOM、SAX、STAX的API具體實現。

由SUN提供 ,在JDK 6.0以後全面支持DOM、SAX、STAX三種解析方式。

XML PULL:拉模式解析XML框架,內置集成Android手機內部 。

DOM4J:DOM解析方式框架,開源。在企業端JavaEE 軟件開發中。為最流行開發框架。

javax.xml核心xml解析API,是DOM、SAX、STAX公用API。

org.w3c.dom 與DOM解析相關具體API

org.xml.sax 與SAX解析相關具體API


整個XML會被解析為樹形結構,元素、屬性、文本,都會被解析為 Node節點 。

********

7、DOM解析入門:

(一)

(1)創建解析器工廠

DocumentBuilderFactory builderFactory=DocumentBuilderFactory.newInstance();

(2)根據解析器工廠獲得解析器

DocumentBuilder documentBuilder=builderFactory.newDocumentBuilder();

(3)解析器讀取XML文檔進行解析,為Document對象(文檔對象,代表整個XML文檔)

Document document=documentBuilder.parse("test.xml");

(4)獲得document文檔後,就可以對它進行操作了。

例如 :可以通過getElementsByTagName查找指定名稱元素NodeList。

NodeList nodeList=document.getElementsByTagName("name");

然後遍歷集合獲得每個Node節點。

for(int i=0;i<nodeList.getLength();i++){

Element node=(Element)nodeList.item(i);

再通過Node的getTextContent獲得節點文本內容 。

System.out.println(node.getTextContent());

}


(二)**node節點公共API中,

getNodeName()返回節點的名稱

getNodeType()返回節點的類型

getNodeValue()返回節點的值


(三)**XML 提供數據只能通過兩種情況 :

第一種 <name>xml解析技術</name> 第二種 <book id="001">

* 獲得元素文本子節點內容 獲得元素後 element.getTextContent() element.getFirstChild().getNodeValue()

* 獲得元素屬性值 獲得元素後 element.getAttribute(屬性名)


(四)節點元素查詢時

1、全局查找縮小範圍

2、相對位置查找 父親 兒子 兄弟 獲得相對節點元素內容

註意事項

1、查詢元素子節點時,註意回車換行

2、Document 類中 getElementById --- 使用時 xml文檔必須有約束 DTD默認加載 , Schema需要編程


(五)對XML 進行增刪改查 ---- 增加 、修改 、刪除

* 對內存XML 文檔修改後,回寫到xml 文件中


添加節點 1、創建目標節點 document.createXXX 2、找到合適位置插入 父節點.appendChild

修改節點 1 修改文本內容 element.setTextContent(value) 2 修改屬性 element.setAttribute(name,value)

刪除節點 1 獲得要刪除節點o 2. o.getParentNode().removeChild(o);

**(詳細代碼參見代碼附錄)


8、JAXP SAX 解析API

原理見上。

事件

startDocument 文檔開始事件

startElement 元素開始事件

characters 文本元素事件

endElement 元素結束事件

endDocument 文檔結束事件


對於SAX編程不要求掌握,了解原理就可以了。


在startElement 中 獲得 開始元素是什麽?qName 獲得開始標簽屬性內容 ?attributes.getValue("屬性名稱")

在characters 中 獲得讀取到文本元素是什麽 ? new String(ch,start,length)

在endElement 中 獲得當前結束元素是什麽 ?qName


9、XML Pull 解析器

(一)為開源框架 ,使用STAX類似拉模式解析方式。Android手機系統內置 工具類庫。

** 從事Android開發 。因為內置,無需下載任何jar包 ---- 如果從事JavaEE開發需要單獨下載pull解析器類庫。

**在pull 解析器官網上,看到pull解析器 API接口 。

**XNI2 XmlPull 、XPP3/MXP1 、kXML2 都是 pull解析器 接口API 的實現

**課程采用 xpp3 這套 pull解析器實現。

(二)什麽是jar 包?

很多開源框架,會將class文件用zip格式進行壓縮 獲得壓縮包。擴展名 jar (jar包)

(三)XML PULL 快速入門


(1)、去官網下載 zip 壓縮包(xpp3-1.1.3.4.C_all.zip),解壓縮獲得jar包(xpp3-1.1.3.4.C.jar)。

(2)、在當前工程目錄下新建lib文件夾,將該jar包放到lib目錄下。

(3)、右擊jar包,Add to build path 將jar包添加到 當前工程 build path.


事件

start document

start tag

text

end tag

end document


**使用pull解析器生成XML

(1)、獲得解析器工廠

XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();

(2)、通過解析器工廠 獲得序列化程序對象 XmlSerializer

XmlPullParser parser = parserFactory.newPullParser();

(3)、設置 輸出XML文件 位置

(4)、開始寫 存在5個方法寫你需要內容


*** 能力: 將List中數據 序列化到一個XML文件中 。


10、XML PULL 解析方式 與 SAX push 最大區別?

程序員可以自己控制解析過程 。

用push 自動執行所有解析事件,使用pull 程序員可以控制只執行關註的那些事件,pull解析方式效率比push方式更高。


**獲得元素屬性 ----- 在元素開始時 ,通過parser.getAttributeValue(null,屬性名稱);

獲得元素內部文本內容 ----- 在元素開始時, parser.nextText();


11、XML PULL 對xml文件 進行CURD (Create Update Read Delete)

* 使用pull 讀取xml,讀取內容不釋放,在內存中保留 ---- DOM 類似

* 解析XML --- List 序列化 List --- XML

* 使用pull 進行增刪改查 --- 讀取xml全部數據保存內存list對象,對內存list對象進行增刪改查。


XML解析方法詳解