// SAXTest.java - test application for SAX2 package org.htmlparser.tests; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import org.xml.sax.Attributes; import org.xml.sax.ContentHandler; import org.xml.sax.ErrorHandler; import org.xml.sax.Locator; import org.xml.sax.SAXException; import org.xml.sax.SAXNotRecognizedException; import org.xml.sax.SAXNotSupportedException; import org.xml.sax.SAXParseException; import org.xml.sax.XMLReader; import org.xml.sax.helpers.XMLReaderFactory; /** * Test class for SAX2. */ public class SAXTest implements ContentHandler, ErrorHandler { //////////////////////////////////////////////////////////////////// // Main app. //////////////////////////////////////////////////////////////////// /** * Main application entry point. */ public static void main (String args[]) { System.out.println("************************************" + "************************************"); System.out.println("* Testing SAX2"); System.out.println("************************************" + "************************************"); System.out.print("\n"); // // Figure out the XML reader // // String driverName = // System.getProperty("org.xml.sax.driver", // "org.apache.xerces.parsers.SAXParser"); String driverName = "org.htmlparser.sax.XMLReader"; System.out.println("SAX driver class: " + driverName + "\n (you can specify a different one using the " + "org.xml.sax.driver property)"); System.out.print("\n"); // // Create the XML reader // System.out.println("Now, we'll try to create an instance of the " + "driver, using XMLReaderFactory"); XMLReader reader = null; try { reader = XMLReaderFactory.createXMLReader(driverName); } catch (SAXException e) { System.out.println("Failed to create XMLReader: " + e.getMessage() + "\nMake sure that the class actually " + "exists and is present on your CLASSPATH" + "\nor specify a different class using the " + "org.xml.sax.driver property"); System.exit(1); } System.out.println("XMLReader created successfully\n"); // // Check features. // System.out.println("Checking defaults for some well-known features:"); checkFeature(reader, "http://xml.org/sax/features/namespaces"); checkFeature(reader, "http://xml.org/sax/features/namespace-prefixes"); checkFeature(reader, "http://xml.org/sax/features/string-interning"); checkFeature(reader, "http://xml.org/sax/features/validation"); checkFeature(reader, "http://xml.org/sax/features/external-general-entities"); checkFeature(reader, "http://xml.org/sax/features/external-parameter-entities"); System.out.print("\n"); // // Assign handlers. // System.out.println("Creating and assigning handlers\n"); SAXTest handler = new SAXTest(); reader.setContentHandler(handler); reader.setErrorHandler(handler); // // Parse documents. // if (args.length > 0) { for (int i = 0; i < args.length; i++) { String systemId = makeAbsoluteURL(args[i]); System.out.println("Trying file " + systemId); try { reader.parse(systemId); } catch (SAXException e1) { System.out.println(systemId + " failed with XML error: " + e1.getMessage()); } catch (IOException e2) { System.out.println(systemId + " failed with I/O error: " + e2.getMessage()); } System.out.print("\n"); } } else { System.out.println("No documents supplied on command line; " + "parsing skipped."); } // // Done. // System.out.println("SAX2 test finished."); } /** * Check and display the value of a feature. */ private static void checkFeature (XMLReader reader, String name) { try { System.out.println(" " + name + " = " + reader.getFeature(name)); } catch (SAXNotRecognizedException e) { System.out.println("XMLReader does not recognize feature " + name); } catch (SAXNotSupportedException e) { System.out.println("XMLReader recognizes feature " + name + " but does not support checking its value"); } } /** * Construct an absolute URL if necessary. * * This method is useful for relative file paths on a command * line; it converts them to absolute file: URLs, using the * correct path separator. This method is based on an * original suggestion by James Clark. * * @param url The (possibly relative) URL. * @return An absolute URL of some sort. */ private static String makeAbsoluteURL (String url) { URL baseURL; String currentDirectory = System.getProperty("user.dir"); String fileSep = System.getProperty("file.separator"); String file = currentDirectory.replace(fileSep.charAt(0), '/') + '/'; if (file.charAt(0) != '/') { file = "/" + file; } try { baseURL = new URL("file", null, file); return new URL(baseURL, url).toString(); } catch (MalformedURLException e) { System.err.println(url + ": " + e.getMessage()); return url; } } private static String makeNSName (String uri, String localName, String qName) { if (uri.equals("")) uri = "[none]"; if (localName.equals("")) localName = "[none]"; if (qName.equals("")) qName = "[none]"; return uri + '/' + localName + '/' + qName; } private static String escapeData (char ch[], int start, int length) { StringBuffer buf = new StringBuffer(); for (int i = start; i < start + length; i++) { switch(ch[i]) { case '\n': buf.append("\\n"); break; case '\t': buf.append("\\t"); break; case '\r': buf.append("\\r"); break; default: buf.append(ch[i]); break; } } return buf.toString(); } //////////////////////////////////////////////////////////////////// // Implementation of org.xml.sax.ContentHandler. //////////////////////////////////////////////////////////////////// public void setDocumentLocator (Locator locator) { System.out.println(" EVENT: setDocumentLocator"); } public void startDocument () throws SAXException { System.out.println(" EVENT: startDocument"); } public void endDocument () throws SAXException { System.out.println(" EVENT: endDocument"); } public void startPrefixMapping (String prefix, String uri) throws SAXException { System.out.println(" EVENT: startPrefixMapping " + prefix + " = " + uri); } public void endPrefixMapping (String prefix) throws SAXException { System.out.println(" EVENT: endPrefixMapping " + prefix); } public void startElement (String namespaceURI, String localName, String qName, Attributes atts) throws SAXException { System.out.println(" EVENT: startElement " + makeNSName(namespaceURI, localName, qName)); int attLen = atts.getLength(); for (int i = 0; i < attLen; i++) { char ch[] = atts.getValue(i).toCharArray(); System.out.println(" Attribute " + makeNSName(atts.getURI(i), atts.getLocalName(i), atts.getQName(i)) + '=' + escapeData(ch, 0, ch.length)); } } public void endElement (String namespaceURI, String localName, String qName) throws SAXException { System.out.println(" EVENT: endElement " + makeNSName(namespaceURI, localName, qName)); } public void characters (char ch[], int start, int length) throws SAXException { System.out.println(" EVENT: characters " + escapeData(ch, start, length)); } public void ignorableWhitespace (char ch[], int start, int length) throws SAXException { System.out.println(" EVENT: ignorableWhitespace " + escapeData(ch, start, length)); } public void processingInstruction (String target, String data) throws SAXException { System.out.println(" EVENT: processingInstruction " + target + ' ' + data); } public void skippedEntity (String name) throws SAXException { System.out.println(" EVENT: skippedEntity " + name); } //////////////////////////////////////////////////////////////////// // Implementation of org.xml.sax.ErrorHandler. //////////////////////////////////////////////////////////////////// public void warning (SAXParseException e) throws SAXException { System.out.println(" EVENT: warning " + e.getMessage() + ' ' + e.getSystemId() + ' ' + e.getLineNumber() + ' ' + e.getColumnNumber()); } public void error (SAXParseException e) throws SAXException { System.out.println(" EVENT: error " + e.getMessage() + ' ' + e.getSystemId() + ' ' + e.getLineNumber() + ' ' + e.getColumnNumber()); } public void fatalError (SAXParseException e) throws SAXException { System.out.println(" EVENT: fatal error " + e.getMessage() + ' ' + e.getSystemId() + ' ' + e.getLineNumber() + ' ' + e.getColumnNumber()); } } // end of SAXTest.java