免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
XML解析技術(shù)之VTD-XML 簡介及代碼實(shí)例
目錄(?)[-]
XML解析技術(shù)之VTD-XML 簡介及代碼實(shí)例
第一部分XML解析技術(shù)簡介
11 面向文檔的流式解析
 111推式解析SAX
 112拉式解析StAX
12 面向文檔的對(duì)象式解析
13 面向文檔的指針式解析
二VTD-XML基本原理介紹
21 VTD-XML基本原理
第三部分應(yīng)用實(shí)例
第四部分其他解析方式
第一部分:XML解析技術(shù)簡介
XML(eXtensible Markup Language,可擴(kuò)展標(biāo)記語言)是由World Wide Web聯(lián)盟(W3C)定義的元語言,即一種關(guān)于語言的語言。 Xml的優(yōu)勢(shì)或者說力量源于它的數(shù)據(jù)獨(dú)立性,廣泛應(yīng)用在分布式計(jì)算領(lǐng)域。
XML解析技術(shù)的分類
根據(jù)從XML中獲取數(shù)據(jù)的簡易性,性能和最終所得到的數(shù)據(jù)模型的不同,XML解析技術(shù)大致可分為以下四類:
1.面向文檔的流式解析;
2.面向文檔的對(duì)象式解析;
3.面向文檔的指針式解析;
4.面向應(yīng)用的對(duì)象式解析;
這四類解析技術(shù)分別處于不同的抽象層次,適用于不同的應(yīng)用場(chǎng)景, 針對(duì)具體的應(yīng)用需求,選擇合適的解析技術(shù),往往能夠減少內(nèi)存消耗,縮短處理時(shí)間,更方便地獲取數(shù)據(jù),提高應(yīng)用系統(tǒng)的整體性能。
1.1 面向文檔的流式解析
流式解析是解析器順序讀取XML文檔,捕獲的各種事件,如元素開始和元素結(jié)束等,交由程序處理。
流式解析又分為兩種解析方式:
1.推式解析(SAX:Simple API for XML)
2.拉式解析(StAX:Streaming API for XML)
這兩種方式的主要區(qū)別在于是由解析器還是應(yīng)用程序控制讀循環(huán)(讀入文件的循環(huán))
1.1.1推式解析(SAX)
在這種解析方式中,解析器控制著讀循環(huán),在文檔結(jié)束之前控制權(quán)不會(huì)返回給應(yīng)用程序。
SAX是基于事件驅(qū)動(dòng)的,即SAX解析器在讀取XML文檔的過程中生成一個(gè)事件流,并且對(duì)于每個(gè)事件通過回調(diào)事件處理程序中相應(yīng)的方法來進(jìn)行處理。比如元素開始和結(jié)束標(biāo)記,元素內(nèi)容,實(shí)體,語法分析錯(cuò)誤等事件。
下圖表示了一個(gè)Xml文件及其對(duì)應(yīng)的文件流格式。
注:如圖所示,回車換行也被解析成了一個(gè)字符。
1.1.2拉式解析(StAX)
在這種解析方式中,應(yīng)用程序控制著讀循環(huán)。反復(fù)調(diào)用解析器獲得下一個(gè)事件,直到文檔結(jié)束。
StAX針對(duì)同樣的XML文檔所獲得事件類型和SAX基本相同。
1.2 面向文檔的對(duì)象式解析
DOM(Document Object Model)是用與平臺(tái)和語言無關(guān)的方式對(duì)XML文檔進(jìn)行建模的官方W3C標(biāo)準(zhǔn) 。
DOM的層次化對(duì)象模型是一個(gè)樹形結(jié)構(gòu),它將一個(gè)XML文檔看作一棵節(jié)點(diǎn)樹,每個(gè)節(jié)點(diǎn)代表一個(gè)XML文檔中的元素。
DOM的有點(diǎn)在于可以隨機(jī)訪問,但由于DOM在使用數(shù)據(jù)前需要完整的遍歷XML文檔,在內(nèi)存中構(gòu)建樹形結(jié)構(gòu)表示,因此需要消耗大量的內(nèi)存,尤其是對(duì)于大型文檔,性能下降的很快。
下圖表示了Xml文件預(yù)期Dom樹的對(duì)應(yīng)關(guān)系。
1.3 面向文檔的指針式解析
面向文檔的流式解析效率較高,但易用性差,而對(duì)象式解析易用性強(qiáng),卻效率較低。
這兩種方式都是提取式解析(extractive parsing)。拿DOM這個(gè)例子來說,DOM會(huì)將每一個(gè)element, attribute等都在內(nèi)存中解析成對(duì)象并給與一定結(jié)構(gòu)。
更新 效率問題:這種Dom解析模式注定了需要大量的創(chuàng)建和銷毀對(duì)象(GC問題),在DOM中(SAX并不支持更新),每一次改動(dòng)都需要將DOM模型重新完整的解析成XML字符串,原文件并沒有被利用,即DOM并不支持增量更新。為了解決這些問題,提出了一種較新穎的指針式解析技術(shù),即VTD-XML(一種面向文檔的指針式解析)。
二、VTD-XML基本原理介紹
VTD-XML是一種無提取的XML解析方法,它較好的解決了DOM占用內(nèi)存過大的缺點(diǎn),并且還提供了快速的解析與遍歷、對(duì)XPath的支持和增量更新等特性。VTD-XML是一個(gè)開源項(xiàng)目,目前有Java、C兩種平臺(tái)支持。
2.1 VTD-XML基本原理
為了實(shí)現(xiàn)non-extractive(非提?。┻@個(gè)目的,它將原XML文件原封不動(dòng)的以二進(jìn)制的方式讀進(jìn)內(nèi)存,連解碼都不做,然后在這個(gè)二進(jìn)制byte數(shù)組上解析每個(gè) element的位置并把一些信息記錄下來,這種記錄就被成為VTD(Virtual Token Descriptor,虛擬令牌描述符)。
之后的遍歷操作便在這些保存下來的記錄上進(jìn)行,如果需要提取XML內(nèi)容就利用記錄中的位置等 信息在原始byte數(shù)組上進(jìn)行解碼并返回字符串。
VTD(Virtual Token Descriptor,虛擬令牌描述符)結(jié)構(gòu):
VTD是一個(gè)64bits定長的數(shù)值類型,記錄了每個(gè)元素的起始位置(offset),長度(length),深度(depth)以及令牌(元素標(biāo)簽)的類型(type)等信息。
如下圖,表示了每個(gè)元素的位置及類型信息,對(duì)Xml的所有操作都是基于這個(gè)數(shù)據(jù)結(jié)構(gòu)。
下圖表示了VTD目前所支持的所有元素的類型(12種):
查詢與更新:
如果需要提取XML內(nèi)容,就查找VTD數(shù)組,利用VTD記錄中的位置等信息在原始比特?cái)?shù)組上進(jìn)行解碼并返回字符串。
而且VTD-XML還可以高效的實(shí)現(xiàn)增量更新,例如,如果想在一個(gè)大型XML文檔中找出一個(gè)節(jié)點(diǎn)元素并刪除它,那么只需要找到這個(gè)元素的VTD,將這個(gè)VTD從VTD數(shù)組中刪除,然后再利用所有的VTD寫出到另一個(gè)二進(jìn)制數(shù)組中就可以了,這就是所謂增量更新。這個(gè)過程實(shí)際上就是一個(gè)二進(jìn)制數(shù)組的拷貝過程,其效率是非常高的。
下圖是三種主要的XML解析的相關(guān)功能及性能比較:
第三部分:應(yīng)用實(shí)例
VTD-XML解析xml通常經(jīng)過以下幾步:
1.以一個(gè)byte數(shù)組開始(存放xml);
2.利用VTDGen進(jìn)行解析;
3. 利用VTDNav進(jìn)行導(dǎo)航定位;
4. 節(jié)點(diǎn)遍歷使用Autopilot;
5. 利用Xpath進(jìn)行節(jié)點(diǎn)選擇
6. 增量更新使用XMLModifier
下面的代碼主要功能:首先根據(jù)Xpath選擇某些屬性partNum='872-AA' 的item元素并用someting元素替換;替換價(jià)格小于40的元素文本為200.
Java代碼  
/* In this java program, we demonstrate how to use XMLModifier to incrementally
* update an simple XML purchase order.
* a particular name space. We also are going
* to use VTDGen's parseFile to simplify programming.
*/
import java.io.File;
import java.io.FileOutputStream;
import com.ximpleware.AutoPilot;
import com.ximpleware.ModifyException;
import com.ximpleware.NavException;
import com.ximpleware.VTDGen;
import com.ximpleware.VTDNav;
import com.ximpleware.XMLModifier;
public class update {
public static void main(String argv[]){
try {
// open a file and read the content into a byte array
VTDGen vg = new VTDGen();
String path = update.class.getResource("").getPath();
System.out.println(path);
if (vg.parseFile(path + "oldpo.xml", true)){
VTDNav vn = vg.getNav();
File fo = new File("f:/newpo.xml");
FileOutputStream fos = new FileOutputStream(fo);
AutoPilot ap = new AutoPilot(vn);
XMLModifier xm = new XMLModifier(vn);
ap.selectXPath("/purchaseOrder/items/item[@partNum='872-AA']");
int i = -1;
while((i=ap.evalXPath())!=-1){
xm.remove();
xm.insertBeforeElement("<something/>\n");
}
ap.selectXPath("/purchaseOrder/items/item/USPrice[.<40]/text()");
while((i=ap.evalXPath())!=-1){
xm.updateToken(i,"200");
}
xm.output(fos);
fos.close();
}
}
catch (NavException e){
System.out.println(" Exception during navigation "+e);
}
catch (ModifyException e){
System.out.println(" Modify exception occurred "+e);
}
catch (Exception e){
}
}
修改前的Xml文件:
<?xml version="1.0" encoding="UTF-8"?>
<purchaseOrder orderDate="1999-10-20">
<comment>Hurry, my lawn is going wild!</comment>
<items>
<item partNum="872-AA">
<productName>Lawnmower</productName>
<quantity><![CDATA[1]]></quantity>
<USPrice>148.95</USPrice>
<comment>Confirm this is electric</comment>
</item>
<item partNum="926-AA">
<productName>Baby Monitor</productName>
<quantity>1</quantity>
<USPrice>39.98</USPrice>
<shipDate>1999-05-21</shipDate>
</item>
</items>
</purchaseOrder>
修改后的Xml文件,紅色字體為修改后的:
<?xml version="1.0"?>
<purchaseOrder orderDate="1999-10-20">
<comment>Hurry, my lawn is going wild!</comment>
<items>
<something/>
<item partNum="926-AA">
<productName>Baby Monitor</productName>
<quantity>1</quantity>
<USPrice>200</USPrice>
<shipDate>1999-05-21</shipDate>
</item>
</items>
</purchaseOrder>
官網(wǎng)地址:http://vtd-xml.sourceforge.net/
第四部分:其他解析方式
前面所談到的三種解析技術(shù)都是面向文檔的,還有第四種解析技術(shù):面向應(yīng)用的對(duì)象式解析技術(shù)。
面向文檔的解析技術(shù)對(duì)主要關(guān)心文檔的XML結(jié)構(gòu)的應(yīng)用程序來說是適用的,但是有很多應(yīng)用程序僅僅將XML作為數(shù)據(jù)交換的媒介,它們更關(guān)心的是文檔數(shù)據(jù)本身,而面向應(yīng)用的對(duì)象式解析技術(shù)更適用。
面向應(yīng)用的對(duì)象式解析技術(shù)又稱為為XML數(shù)據(jù)綁定,指將數(shù)據(jù)從一些存儲(chǔ)媒介(如XML文檔、文本文件和數(shù)據(jù)庫)中取出,并通過應(yīng)用程序表示這些數(shù)據(jù)的過程,即把數(shù)據(jù)綁定到虛擬機(jī)能夠理解并且可以操作的某種內(nèi)存中的結(jié)構(gòu)。
數(shù)據(jù)綁定并不是一個(gè)新鮮的概念,其在關(guān)系數(shù)據(jù)庫上早已得到了廣泛的應(yīng)用,如Hibernate就是針對(duì)數(shù)據(jù)庫的輕量級(jí)數(shù)據(jù)綁定框架。
本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
理解XML Schema: XML Schema初步(II)
借助 VTD-XML* 改進(jìn) XML 處理
在 HTML中顯示XML數(shù)據(jù)的策略
DOM和SAX的區(qū)別
Java解析XML文檔――dom解析xml
Web數(shù)據(jù)管理
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服