Created
March 1, 2013 12:37
-
-
Save cedias/5064365 to your computer and use it in GitHub Desktop.
LI357 useful Examples
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| import java.io.File; | |
| import java.io.FileReader; | |
| import java.io.IOException; | |
| import javax.xml.parsers.ParserConfigurationException; | |
| import javax.xml.parsers.SAXParserFactory; | |
| import org.xml.sax.AttributeList; | |
| import org.xml.sax.InputSource; | |
| import org.xml.sax.SAXException; | |
| import org.xml.sax.SAXParseException; | |
| /** | |
| * | |
| * This class implements the HandlerBase helper class, which means that it | |
| * defines all the "callback" methods that the SAX parser will invoke to notify | |
| * the application. In this example we override the methods that we require. | |
| * | |
| * This example uses full package names in places to help keep the JAXP and SAX | |
| * APIs distinct. | |
| */ | |
| public class SAXDemo extends org.xml.sax.HandlerBase { | |
| /** The main method sets things up for parsing */ | |
| public static void main(String[] args) throws IOException, SAXException, | |
| ParserConfigurationException { | |
| // Create a JAXP "parser factory" for creating SAX parsers | |
| javax.xml.parsers.SAXParserFactory spf = SAXParserFactory.newInstance(); | |
| // Configure the parser factory for the type of parsers we require | |
| spf.setValidating(false); // No validation required | |
| // Now use the parser factory to create a SAXParser object | |
| // Note that SAXParser is a JAXP class, not a SAX class | |
| javax.xml.parsers.SAXParser sp = spf.newSAXParser(); | |
| // Create a SAX input source for the file argument | |
| org.xml.sax.InputSource input = new InputSource(new FileReader(args[0])); | |
| // Give the InputSource an absolute URL for the file, so that | |
| // it can resolve relative URLs in a <!DOCTYPE> declaration, e.g. | |
| input.setSystemId("file://" + new File(args[0]).getAbsolutePath()); | |
| // Create an instance of this class; it defines all the handler methods | |
| SAXDemo handler = new SAXDemo(); | |
| // Finally, tell the parser to parse the input and notify the handler | |
| sp.parse(input, handler); | |
| // Instead of using the SAXParser.parse() method, which is part of the | |
| // JAXP API, we could also use the SAX1 API directly. Note the | |
| // difference between the JAXP class javax.xml.parsers.SAXParser and | |
| // the SAX1 class org.xml.sax.Parser | |
| // | |
| // org.xml.sax.Parser parser = sp.getParser(); // Get the SAX parser | |
| // parser.setDocumentHandler(handler); // Set main handler | |
| // parser.setErrorHandler(handler); // Set error handler | |
| // parser.parse(input); // Parse! | |
| } | |
| StringBuffer accumulator = new StringBuffer(); // Accumulate parsed text | |
| String servletName; // The name of the servlet | |
| String servletClass; // The class name of the servlet | |
| String servletId; // Value of id attribute of <servlet> tag | |
| // When the parser encounters plain text (not XML elements), it calls | |
| // this method, which accumulates them in a string buffer | |
| public void characters(char[] buffer, int start, int length) { | |
| accumulator.append(buffer, start, length); | |
| } | |
| // Every time the parser encounters the beginning of a new element, it | |
| // calls this method, which resets the string buffer | |
| public void startElement(String name, AttributeList attributes) { | |
| accumulator.setLength(0); // Ready to accumulate new text | |
| // If its a servlet tag, look for id attribute | |
| if (name.equals("servlet")) | |
| servletId = attributes.getValue("id"); | |
| } | |
| // When the parser encounters the end of an element, it calls this method | |
| public void endElement(String name) { | |
| if (name.equals("servlet-name")) { | |
| // After </servlet-name>, we know the servlet name saved up | |
| servletName = accumulator.toString().trim(); | |
| } else if (name.equals("servlet-class")) { | |
| // After </servlet-class>, we've got the class name accumulated | |
| servletClass = accumulator.toString().trim(); | |
| } else if (name.equals("servlet")) { | |
| // Assuming the document is valid, then when we parse </servlet>, | |
| // we know we've got a servlet name and class name to print out | |
| System.out.println("Servlet " + servletName | |
| + ((servletId != null) ? " (id=" + servletId + ")" : "") | |
| + ": " + servletClass); | |
| } | |
| } | |
| /** This method is called when warnings occur */ | |
| public void warning(SAXParseException exception) { | |
| System.err.println("WARNING: line " + exception.getLineNumber() + ": " | |
| + exception.getMessage()); | |
| } | |
| /** This method is called when errors occur */ | |
| public void error(SAXParseException exception) { | |
| System.err.println("ERROR: line " + exception.getLineNumber() + ": " | |
| + exception.getMessage()); | |
| } | |
| /** This method is called when non-recoverable errors occur. */ | |
| public void fatalError(SAXParseException exception) throws SAXException { | |
| System.err.println("FATAL: line " + exception.getLineNumber() + ": " | |
| + exception.getMessage()); | |
| throw (exception); | |
| } | |
| } | |
| // Sample XML file | |
| /* | |
| * <?xml version="1.0" encoding="ISO-8859-1"?> | |
| * | |
| * <web> <s id="hello_servlet_id"> <name>hello </name> <class>Hello </class> | |
| * </s> | |
| * | |
| * </web> | |
| * | |
| */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment