We wrote the indenting parser example to store the display text in an array named displayStrings , so it's easy to display that text in a Java window as we did in the previous chapter. To do that, I'll create a new example named ch12_05.java. In this program, I'll create a new object of a class that I'll call AppFrame , and I'll pass displayStrings and the number of lines to display to the AppFrame class's constructor. Then I'll call the AppFrame object's show method to show the window: import java.awt.*; import java.awt.event.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.*; import java.io.*; public class ch12_05 extends DefaultHandler { . . . public static void main(String args[]) { ch12_05 obj = new ch12_05(); obj.displayDocument(args[0]); AppFrame f = new AppFrame(displayStrings, numberDisplayLines); f.setSize(300, 500); f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}}); f.show(); } } The AppFrame class is based on the Java Frame class, and it displays the text we've passed to it: class AppFrame extends Frame { String displayStrings[]; int numberDisplayLines; public AppFrame(String[] d, int n) { displayStrings = d; numberDisplayLines = n; } public void paint(Graphics g) { Font font; font = new Font("Courier", Font.PLAIN, 12); g.setFont(font); FontMetrics fontmetrics = g.getFontMetrics(getFont()); int y = fontmetrics.getHeight(); for(int index = 0; index < numberDisplayLines; index++){ y += fontmetrics.getHeight(); g.drawString(displayStrings[index], 5, y); } } } You can see this new application at work in Figure 12-3, where ch12_01.xml is displayed in a Java window. Figure 12-3. A window-based browser using a SAX parser.
Here's the code for this example: Listing ch12_05.javaimport java.awt.*; import java.awt.event.*; import org.xml.sax.*; import org.xml.sax.helpers.DefaultHandler; import javax.xml.parsers.*; import java.io.*; public class ch12_05 extends DefaultHandler { static String displayStrings[] = new String[1000]; static int numberDisplayLines = 0; static String indent = ""; public void displayDocument(String uri) { DefaultHandler handler = this; SAXParserFactory factory = SAXParserFactory.newInstance(); try { SAXParser saxParser = factory.newSAXParser(); saxParser.parse(new File(uri), handler); } catch (Throwable t) {} } public void processingInstruction(String target, String data) { displayStrings[numberDisplayLines] = indent; displayStrings[numberDisplayLines] += "<?"; displayStrings[numberDisplayLines] += target; if (data != null && data.length() > 0) { displayStrings[numberDisplayLines] += ' '; displayStrings[numberDisplayLines] += data; } displayStrings[numberDisplayLines] += "?>"; numberDisplayLines++; } public void startDocument() { displayStrings[numberDisplayLines] = indent; displayStrings[numberDisplayLines] += "<?xml version=\"1.0\" encoding=\""+ "UTF-8" + "\"?>"; numberDisplayLines++; } public void startElement(String uri, String localName, String qualifiedName, Attributes attributes) { displayStrings[numberDisplayLines] = indent; indent += " "; displayStrings[numberDisplayLines] += '<'; displayStrings[numberDisplayLines] += qualifiedName; if (attributes != null) { int numberAttributes = attributes.getLength(); for (int loopIndex = 0; loopIndex < numberAttributes; loopIndex++) { displayStrings[numberDisplayLines] += ' '; displayStrings[numberDisplayLines] += attributes.getLocalName(loopIndex); displayStrings[numberDisplayLines] += "=\""; displayStrings[numberDisplayLines] += attributes.getValue(loopIndex); displayStrings[numberDisplayLines] += '"'; } } displayStrings[numberDisplayLines] += '>'; numberDisplayLines++; } public void characters(char characters[], int start, int length) { String characterData = (new String(characters, start, length)).trim(); if(characterData.indexOf("\n") < 0 && characterData.length() > 0) { displayStrings[numberDisplayLines] = indent; displayStrings[numberDisplayLines] += characterData; numberDisplayLines++; } } public void ignorableWhitespace(char characters[], int start, int length) { //characters(characters, start, length); } public void endElement(String uri, String localName, String qualifiedName) { indent = indent.substring(0, indent.length() - 4); displayStrings[numberDisplayLines] = indent; displayStrings[numberDisplayLines] += "</"; displayStrings[numberDisplayLines] += qualifiedName; displayStrings[numberDisplayLines] += '>'; numberDisplayLines++; } public void warning(SAXParseException exception) { System.err.println("WARNING! " + exception.getMessage()); } public void error(SAXParseException exception) { System.err.println("ERROR! " + exception.getMessage()); } public void fatalError(SAXParseException exception) { System.err.println("FATAL ERROR! " + exception.getMessage()); } public static void main(String args[]) { ch12_05 obj = new ch12_05(); obj.displayDocument(args[0]); AppFrame f = new AppFrame(displayStrings, numberDisplayLines); f.setSize(300, 500); f.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0);}}); f.show(); } } class AppFrame extends Frame { String displayStrings[]; int numberDisplayLines; public AppFrame(String[] d, int n) { displayStrings = d; numberDisplayLines = n; } public void paint(Graphics g) { Font font; font = new Font("Courier", Font.PLAIN, 12); g.setFont(font); FontMetrics fontmetrics = g.getFontMetrics(getFont()); int y = fontmetrics.getHeight(); for(int index = 0; index < numberDisplayLines; index++){ y += fontmetrics.getHeight(); g.drawString(displayStrings[index], 5, y); } } } Now that we're parsing and displaying XML documents in windows , there's no reason to restrict ourselves to displaying the text form of an XML document, just as we did in the previous chapter. But this time, we'll use the SAX parser. Take a look at the next section. |