<a>
<b>Hello World</b>
<c a1="123"></c>
</a>
pre | post | level | tag | text
------------------------------------------
1 | 4 | 1 | "a" | null
2 | 2 | 2 | "b" | null
3 | 1 | 3 | null | "Hello World"
4 | 3 | 2 | "c" | null
pre | attr | value
------------------
4 | a1 | "123"
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Stack;
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class SAXExample {
class MyHandler extends DefaultHandler{
private int pre = 0;
private int post = 1;
private int level = 0;
private ArrayList<Node> nodes;
private Stack<Integer> preStack;
public void startDocument() {
nodes = new ArrayList<Node>();
// The first node is Root node.
nodes.add(new Node(0, 0, null, null));
preStack = new Stack<Integer>();
}
public void startElement(String namespaceURI, String localName,
String qName, Attributes atts) {
pre++;
level++;
preStack.push(pre);
nodes.add(new Node(pre, level, qName, null));
}
public void endElement(String namespaceURI, String localName,
String fullName) throws SAXException {
post++;
level--;
}
private class Node {
private int preorder;
private int postorder;
private int level;
private String tag;
private String text;
private Node(int pr, int lv, String tg, String t) {
preorder = pr;
level = lv;
tag = tg;
text = t;
}
public int getPreorder(){
return preorder;
}
public int getPostorder(){
return postorder;
}
public int getLevel(){
return level;
}
public String getTag(){
return tag;
}
public String getText(){
return text;
}
}
void charachters(char[] buffer, int start, int len){
System.out.println(new String(buffer, start, len));
}
public void endDocument(){
// for(int i = 1; i < nodes.size(); i ++){
// System.out.println(nodes.get(i).getLevel() + " : " + preStack.pop());
// }
}
}// MyHandler
public static void main(String args[]){
SAXExample ex = new SAXExample();
SAXParserFactory fac = SAXParserFactory.newInstance();
try {
SAXParser parser = fac.newSAXParser();
MyHandler handler = ex.new MyHandler();
parser.parse(new File("a.xml"), handler);
// System.out.println(handler.nodes.size());
output(handler.nodes);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void output(ArrayList<MyHandler.Node> arr){
if(arr == null)return;
boolean iStart = true;
Iterator<MyHandler.Node> it = arr.iterator();
while(it.hasNext()){
MyHandler.Node node = it.next();
// Output the head line
if(iStart == true){
System.out.println("pre/t|/tpost/t|/tlevel/t|/ttag/t|/ttext");
iStart = false;
}
// DO Not output the Root node,
if(node.getLevel() == 0){
continue;
}
// Output the node one by one.
System.out.println(node.getPreorder() + "/t|/t"
+ node.getPostorder() + "/t|/t"
+ node.getLevel() + "/t|/t"
+ node.getTag() + "/t|/t"
+ node.getText());
}
}
}