VTD解析XML( VTDGen、AutoPilot )
轉載:【https://blog.csdn.net/JAVA_8206/article/details/52084846】
轉載:【https://blog.csdn.net/phiill_01/article/details/8727292】
程式碼 + 理論
程式碼部分
VTD解析xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <body> <id>0001</id> <name>zhangsan</name> <records> <record> <school>frist</school> </record> <record> <school>second</school> </record> </records> </body>
取出record下的school中的資訊
public static void main(String[] args) { try { VTDGen gen = new VTDGen(); // 解析student.xml物件,不含有名稱空間 gen.parseFile("e:\\student.xml", false); VTDNav nav = gen.getNav(); AutoPilot ap = new AutoPilot(); AutoPilot ape = new AutoPilot(); // 將導航器繫結到ap對像上 // 如果把VTDNav表達為車輛上導航儀器的話,那麼Autoap就代表開車人,他能更智慧化的找到XPATH表達的含義 ap.bind(nav); ape.bind(nav); // 設定重新設定一個xpath表示式的字串,但是通常是在之後呼叫 ape.selectXPath("/body/records/record"); List<String> records = new ArrayList<String>(); String school= "" ; // evalXPath()返回nodeset集合中的下一個節點,如果檢測到為匹配的節點,則返回為-1 while(ape.evalXPath() != -1){ ap.selectXPath("school"); school= ap.evalXPathToString(); records.add(school); } ape.resetXPath(); for(String s : records){ System.out.println("===" + s); } } catch (Exception ex) { ex.printStackTrace(); } }
理論部分
【原理】
1、將XML檔案以位元組流的方式讀取到記憶體中。
2、判斷檔案的編碼,用相應的編碼來獲取字元
3、對字元解析構建一個VTD格式的資料結構,來儲存XML檔案的一些資訊
4、從VTD資料結構來獲取相應的資訊
1 以一個byte陣列開始(存放xml);
2 利用VTDGen進行解析
3 利用VTDNav進行導航定位
4 節點遍歷使用AutoPilot
5 利用XPath進行節點選擇
注:
如果把VTDNav表達為車輛上導航儀器的話,那麼Autoap就代表開車人,
他能更智慧化的找到XPATH表達的含義
VTDGen
a、讀取並且解析XML.如果XML格式錯誤將不能解析
b、在解析的過程中建立相應的索引
c、儲存的是原始的二進位制資料,沒有轉碼
使用:
VTDGen vtdGen = new VTDGen();
vtdGen.parseFile(file, boolean NS);
VTDNav nav = vtdGen.getNav();
注:大資料量的XML使用:VTDGenHuge利用VTDGen進行當前遊標位置的導航,方法有:
a、 toElement:(作用是控制遊標的移動)
ROOT :將遊標移動到根節點
PARENT:將遊標移動到當前節點的父節點
FIRST_CHILD:將遊標移動到當前節點的第一個子節點
LAST_CHILD :將遊標移動到當前節點的最後一個子節點
NEXT_SIBLING:將遊標移動到當前節點的下一個兄弟節點
PREV_SIBLING:將遊標移動當前節點的上一個兄弟節點
b、toElementNS:帶有名稱空間
C、getText() 返回一個index
.toString(int index) 會將 >、<、&等轉義符解析。
.toRawString(int index) 顧名思義,是“未經任何處理的字串”。
.toNormalizedString(int index) 則會在解析特殊轉義符的基礎上,
將文字中的空白字元(包括空格、換行符、製表符等等)用一個空格代替,以使結果看起來更加“正常”。
主要是對當前遊標的資料的一些具體處理。節點遍歷使用Autopilot; 繫結相應的XPATH
使用:
1、設定XPATH
AutoPilot ap = new AutoPilot();
ap.selectXPath(“/a/b/text()”);
2、與VTDNav導航相繫結
VTDNav vn = vg.getNav();
ap.bind(vn);
3、控制遊標
ap.evalXPath():遊標移動到下一個xpath制定的位置
如果要回到第一個xpath的位置:ap.resetXPath();
4、XPATH 的相對遍歷比絕對遍歷的速度要快(可以使用XPATH 軸)
5、VTDNav 的push和pop方法來儲存遊標的上一個位置增量更新使用XMLModifier。
增量修改可以不用再遍歷整個文件二進行值修改,這樣就提高了修改的效率。
使用:
XMLModifier xm = new XMLModifier();
ap.bind(vn);繫結XPATH來指定修改位置
xm.bind(vn);繫結TVDgen
方法:
insertAttribute(” attr1=’val’ attr2=’val2’”);
remove()
insertBeforeElement(),insertAfterElement()
updateElementName()名稱空間:
帶有名稱空間的xpath:
AutoPilot ap = new AutoPilot();
ap.declareXPathNameSpace(“ns1”,”someURL”);
ap.selectXPath(“/ns1:a/ns1:b/text()”);