Difference between revisions of "User:Rick.barkhouse.oracle.com/VTD"

From Eclipsepedia

Jump to: navigation, search
Line 49: Line 49:
 
** Allows for basic "walking" through elements
 
** Allows for basic "walking" through elements
 
** Maintains a single cursor into the <tt>byte[]</tt> representation of XML
 
** Maintains a single cursor into the <tt>byte[]</tt> representation of XML
 +
 +
<div style="width:900px">
 +
<source lang="xml">
 +
<?xml version="1.0" encoding="UTF-8"?>
 +
<ns0:Test xmlns:ns0="uri">
 +
  <name>OBJ1</name>
 +
  <sub-bean>
 +
      <name>OBJ2</name>
 +
  </sub-bean>
 +
  <sub-bean>
 +
      <name>OBJ3</name>
 +
  </sub-bean>
 +
</ns0:Test>
 +
</source>
 +
</div>
  
 
<div style="width:900px">
 
<div style="width:900px">
Line 56: Line 71:
  
 
VTDNav vn = vg.getNav();
 
VTDNav vn = vg.getNav();
 +
 +
// Move cursor to ROOT
 +
if (vn.toElement(VTDNav.ROOT)) {
 +
    System.out.println("Found Root: " + vn.getCurrentIndex());
 +
    // Move cursor to first occurrance of 'name', searching in forward direction (FIRST_CHILD)
 +
    if (vn.toElementNS(VTDNav.FIRST_CHILD, null, "name")) {
 +
        System.out.println("Found 'name': " + vn.getCurrentIndex());
 +
        // Get the index of the text belonging to the current node
 +
        int textIndex = vn.getText();
 +
        if (textIndex != -1) {
 +
            System.out.println("Getting 'name' text: " + textIndex);                   
 +
            System.out.println(vn.toNormalizedString(textIndex));
 +
        }
 +
    }
 +
   
 +
    while (vn.toElementNS(VTDNav.NEXT_SIBLING, null, "sub-bean")) {
 +
        int subBeanIndex = vn.getCurrentIndex();
 +
        System.out.println("Found 'sub-bean': " + subBeanIndex);
 +
        if (vn.toElementNS(VTDNav.FIRST_CHILD, null, "name")) {
 +
            System.out.println("Found 'name': " + vn.getCurrentIndex());
 +
            // Get the index of the text belonging to the current node
 +
            int textIndex = vn.getText();
 +
            if (textIndex != -1) {
 +
                System.out.println("Getting 'name' text: " + textIndex);                   
 +
                System.out.println(vn.toNormalizedString(textIndex));
 +
            }
 +
        }
 +
        // Rewind to top of "sub-bean", to get the next child;
 +
        vn.toElement(VTDNav.PARENT);
 +
    }
 +
}
 
</source>
 
</source>
 
</div>
 
</div>

Revision as of 15:09, 14 December 2012

Contents

VTD-XML Investigation

VTD-XML (http://vtd-xml.sourceforge.net/) is a high-performance XML processing model that deals with XML in a binary form, instead of the traditional text form. VTD stands for Virtual Token Descriptor.

VTD-XML parses an XML document and builds an internal data structure representing the entire XML document in byte[] form. Each "token" of the XML document is represented as the following 64-bit integer:

Vtd layout.jpg

  • Big endian
  • Starting offset: 30 bits (b29 ~ b0) maximum value is 2^30 -1 = 1G -1
  • Length: 20 bits (b51 ~ b32) maximum value is 2^20-1 = 1M -1
    • For some token type
      • Prefix length: 9 bits (b51~ b43) max value 511
      • Q-name length: 11 bits (b42 ~ b 32) max value 1023
  • Depth: 8 bits (b59~b52) max value is 2^8-1 = 255
  • Token type: 4 bits (b63~b60)
  • Reserved bit: 2 bits (b31: b30)


VTD-XML Core Concepts

Generating a VTD-XML Representation of the XML Document (Unmarshal)

Instantiate a new VTDGen object, and parse a byte[]:

VTDGen vg = new VTDGen();
 
// from existing byte[]
// could be either VTD-XML bytes, or bytes from a regular File, etc. (?)
// true indicates namespace aware
byte[] bytes = ...
vg.setDoc(bytes);
vg.parse(true);
 
// - or - 
 
// from file
vg.parseFile("old.xml", false);


Navigating a VTD-XML Document

  • VTDNav
    • Obtained from VTDGen instance
    • Allows for basic "walking" through elements
    • Maintains a single cursor into the byte[] representation of XML
<?xml version="1.0" encoding="UTF-8"?>
<ns0:Test xmlns:ns0="uri">
   <name>OBJ1</name>
   <sub-bean>
       <name>OBJ2</name>
   </sub-bean>
   <sub-bean>
       <name>OBJ3</name>
   </sub-bean>
</ns0:Test>
VTDGen vg = new VTDGen();
vg.parseFile("old.xml", false);
 
VTDNav vn = vg.getNav();
 
// Move cursor to ROOT
if (vn.toElement(VTDNav.ROOT)) {
    System.out.println("Found Root: " + vn.getCurrentIndex());
    // Move cursor to first occurrance of 'name', searching in forward direction (FIRST_CHILD)
    if (vn.toElementNS(VTDNav.FIRST_CHILD, null, "name")) {
        System.out.println("Found 'name': " + vn.getCurrentIndex());
        // Get the index of the text belonging to the current node
        int textIndex = vn.getText();
        if (textIndex != -1) {
            System.out.println("Getting 'name' text: " + textIndex);                    
            System.out.println(vn.toNormalizedString(textIndex));
        }
    }
 
    while (vn.toElementNS(VTDNav.NEXT_SIBLING, null, "sub-bean")) {
        int subBeanIndex = vn.getCurrentIndex();
        System.out.println("Found 'sub-bean': " + subBeanIndex);
        if (vn.toElementNS(VTDNav.FIRST_CHILD, null, "name")) {
            System.out.println("Found 'name': " + vn.getCurrentIndex());
            // Get the index of the text belonging to the current node
            int textIndex = vn.getText();
            if (textIndex != -1) {
                System.out.println("Getting 'name' text: " + textIndex);                    
                System.out.println(vn.toNormalizedString(textIndex));
            }
        }
        // Rewind to top of "sub-bean", to get the next child;
        vn.toElement(VTDNav.PARENT);
    }
}


  • AutoPilot
    • Created from VTDNav instance
    • Allows for XPath execution
    • Allows for iterating over elements selected by XPath
VTDGen vg = new VTDGen();
vg.parseFile("old.xml", false);
 
VTDNav vn = vg.getNav();


Writing a VTD-XML Document (Marshal)

VTDGen vg = new VTDGen();
vg.parseFile("old.xml", false);
VTDNav vn = vg.getNav();
 
XMLModifier xm = new XMLModifier();
xm.bind(vn);
 
// ...
 
// Write to OutputStream
xm.output(new FileOutputStream("new.xml"));


Generating a VTD-XML Index File for Faster Parsing