Mega Code Archive

 
Categories / Java / XML
 

A simple XML parser that builds a tree from SAX events

/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O'Reilly  */ // VSX.java //A simple XML parser that builds a tree from SAX events.  // import java.io.File; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.DefaultTreeModel; import javax.swing.tree.TreeModel; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; public class VSX {   public TreeModel parse(String filename) {     SAXParserFactory factory = SAXParserFactory.newInstance();     XMLTreeHandler handler = new XMLTreeHandler();     try {       // Parse the input.       SAXParser saxParser = factory.newSAXParser();       saxParser.parse(new File(filename), handler);     } catch (Exception e) {       System.err.println("File Read Error: " + e);       e.printStackTrace();       return new DefaultTreeModel(new DefaultMutableTreeNode("error"));     }     return new DefaultTreeModel(handler.getRoot());   }   public static class XMLTreeHandler extends DefaultHandler {     private DefaultMutableTreeNode root, currentNode;     public DefaultMutableTreeNode getRoot() {       return root;     }     // SAX Parser Handler methods...     public void startElement(String namespaceURI, String lName,         String qName, Attributes attrs) throws SAXException {       String eName = lName; // Element name       if ("".equals(eName))         eName = qName;       Tag t = new Tag(eName, attrs);       DefaultMutableTreeNode newNode = new DefaultMutableTreeNode(t);       if (currentNode == null) {         root = newNode;       } else {         // Must not be the root node...         currentNode.add(newNode);       }       currentNode = newNode;     }     public void endElement(String namespaceURI, String sName, String qName)         throws SAXException {       currentNode = (DefaultMutableTreeNode) currentNode.getParent();     }     public void characters(char buf[], int offset, int len)         throws SAXException {       String s = new String(buf, offset, len).trim();       ((Tag) currentNode.getUserObject()).addData(s);     }   }   public static class Tag {     private String name;     private String data;     private Attributes attr;     public Tag(String n, Attributes a) {       name = n;       attr = a;     }     public String getName() {       return name;     }     public Attributes getAttributes() {       return attr;     }     public void setData(String d) {       data = d;     }     public String getData() {       return data;     }     public void addData(String d) {       if (data == null) {         setData(d);       } else {         data += d;       }     }     public String getAttributesAsString() {       StringBuffer buf = new StringBuffer(256);       for (int i = 0; i < attr.getLength(); i++) {         buf.append(attr.getQName(i));         buf.append("=\"");         buf.append(attr.getValue(i));         buf.append("\"");       }       return buf.toString();     }     public String toString() {       String a = getAttributesAsString();       return name + ": " + a + (data == null ? "" : " (" + data + ")");     }   }   public static void main(String args[]) {     JFrame frame = new JFrame("VSX Test");     VSX parser = new VSX();     JTree tree = new JTree(parser.parse("build.xml"));     frame.getContentPane().add(new JScrollPane(tree));     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     frame.setSize(300, 400);     frame.setVisible(true);   } }