1. 程式人生 > >VTD解析XML( VTDGen、AutoPilot )

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表達的含義

  1. VTDGen
    a、讀取並且解析XML.如果XML格式錯誤將不能解析
    b、在解析的過程中建立相應的索引
    c、儲存的是原始的二進位制資料,沒有轉碼
    使用:
    VTDGen vtdGen = new VTDGen();
    vtdGen.parseFile(file, boolean NS);
    VTDNav nav = vtdGen.getNav();
    注:大資料量的XML使用:VTDGenHuge

  2. 利用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) 則會在解析特殊轉義符的基礎上,
    將文字中的空白字元(包括空格、換行符、製表符等等)用一個空格代替,以使結果看起來更加“正常”。
    主要是對當前遊標的資料的一些具體處理。

  3. 節點遍歷使用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方法來儲存遊標的上一個位置

  4. 增量更新使用XMLModifier。
    增量修改可以不用再遍歷整個文件二進行值修改,這樣就提高了修改的效率。
    使用:
    XMLModifier xm = new XMLModifier();
    ap.bind(vn);繫結XPATH來指定修改位置
    xm.bind(vn);繫結TVDgen
    方法:
    insertAttribute(” attr1=’val’ attr2=’val2’”);
    remove()
    insertBeforeElement(),insertAfterElement()
    updateElementName()

  5. 名稱空間:
    帶有名稱空間的xpath:
    AutoPilot ap = new AutoPilot();
    ap.declareXPathNameSpace(“ns1”,”someURL”);
    ap.selectXPath(“/ns1:a/ns1:b/text()”);