Java tutorial
/* 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); } }