Frames | No Frames |
1: // XMLReader.java - read an XML document. 2: // http://www.saxproject.org 3: // Written by David Megginson 4: // NO WARRANTY! This class is in the Public Domain. 5: // $Id: XMLReader.java,v 1.1 2004/12/23 22:38:42 mark Exp $ 6: 7: package org.xml.sax; 8: 9: import java.io.IOException; 10: 11: 12: /** 13: * Interface for reading an XML document using callbacks. 14: * 15: * <blockquote> 16: * <em>This module, both source code and documentation, is in the 17: * Public Domain, and comes with <strong>NO WARRANTY</strong>.</em> 18: * See <a href='http://www.saxproject.org'>http://www.saxproject.org</a> 19: * for further information. 20: * </blockquote> 21: * 22: * <p><strong>Note:</strong> despite its name, this interface does 23: * <em>not</em> extend the standard Java {@link java.io.Reader Reader} 24: * interface, because reading XML is a fundamentally different activity 25: * than reading character data.</p> 26: * 27: * <p>XMLReader is the interface that an XML parser's SAX2 driver must 28: * implement. This interface allows an application to set and 29: * query features and properties in the parser, to register 30: * event handlers for document processing, and to initiate 31: * a document parse.</p> 32: * 33: * <p>All SAX interfaces are assumed to be synchronous: the 34: * {@link #parse parse} methods must not return until parsing 35: * is complete, and readers must wait for an event-handler callback 36: * to return before reporting the next event.</p> 37: * 38: * <p>This interface replaces the (now deprecated) SAX 1.0 {@link 39: * org.xml.sax.Parser Parser} interface. The XMLReader interface 40: * contains two important enhancements over the old Parser 41: * interface (as well as some minor ones):</p> 42: * 43: * <ol> 44: * <li>it adds a standard way to query and set features and 45: * properties; and</li> 46: * <li>it adds Namespace support, which is required for many 47: * higher-level XML standards.</li> 48: * </ol> 49: * 50: * <p>There are adapters available to convert a SAX1 Parser to 51: * a SAX2 XMLReader and vice-versa.</p> 52: * 53: * @since SAX 2.0 54: * @author David Megginson 55: * @version 2.0.1+ (sax2r3pre1) 56: * @see org.xml.sax.XMLFilter 57: * @see org.xml.sax.helpers.ParserAdapter 58: * @see org.xml.sax.helpers.XMLReaderAdapter 59: */ 60: public interface XMLReader 61: { 62: 63: 64: //////////////////////////////////////////////////////////////////// 65: // Configuration. 66: //////////////////////////////////////////////////////////////////// 67: 68: 69: /** 70: * Look up the value of a feature flag. 71: * 72: * <p>The feature name is any fully-qualified URI. It is 73: * possible for an XMLReader to recognize a feature name but 74: * temporarily be unable to return its value. 75: * Some feature values may be available only in specific 76: * contexts, such as before, during, or after a parse. 77: * Also, some feature values may not be programmatically accessible. 78: * (In the case of an adapter for SAX1 {@link Parser}, there is no 79: * implementation-independent way to expose whether the underlying 80: * parser is performing validation, expanding external entities, 81: * and so forth.) </p> 82: * 83: * <p>All XMLReaders are required to recognize the 84: * http://xml.org/sax/features/namespaces and the 85: * http://xml.org/sax/features/namespace-prefixes feature names.</p> 86: * 87: * <p>Typical usage is something like this:</p> 88: * 89: * <pre> 90: * XMLReader r = new MySAXDriver(); 91: * 92: * // try to activate validation 93: * try { 94: * r.setFeature("http://xml.org/sax/features/validation", true); 95: * } catch (SAXException e) { 96: * System.err.println("Cannot activate validation."); 97: * } 98: * 99: * // register event handlers 100: * r.setContentHandler(new MyContentHandler()); 101: * r.setErrorHandler(new MyErrorHandler()); 102: * 103: * // parse the first document 104: * try { 105: * r.parse("http://www.foo.com/mydoc.xml"); 106: * } catch (IOException e) { 107: * System.err.println("I/O exception reading XML document"); 108: * } catch (SAXException e) { 109: * System.err.println("XML exception reading document."); 110: * } 111: * </pre> 112: * 113: * <p>Implementors are free (and encouraged) to invent their own features, 114: * using names built on their own URIs.</p> 115: * 116: * @param name The feature name, which is a fully-qualified URI. 117: * @return The current value of the feature (true or false). 118: * @exception org.xml.sax.SAXNotRecognizedException If the feature 119: * value can't be assigned or retrieved. 120: * @exception org.xml.sax.SAXNotSupportedException When the 121: * XMLReader recognizes the feature name but 122: * cannot determine its value at this time. 123: * @see #setFeature 124: */ 125: public boolean getFeature (String name) 126: throws SAXNotRecognizedException, SAXNotSupportedException; 127: 128: 129: /** 130: * Set the value of a feature flag. 131: * 132: * <p>The feature name is any fully-qualified URI. It is 133: * possible for an XMLReader to expose a feature value but 134: * to be unable to change the current value. 135: * Some feature values may be immutable or mutable only 136: * in specific contexts, such as before, during, or after 137: * a parse.</p> 138: * 139: * <p>All XMLReaders are required to support setting 140: * http://xml.org/sax/features/namespaces to true and 141: * http://xml.org/sax/features/namespace-prefixes to false.</p> 142: * 143: * @param name The feature name, which is a fully-qualified URI. 144: * @param value The requested value of the feature (true or false). 145: * @exception org.xml.sax.SAXNotRecognizedException If the feature 146: * value can't be assigned or retrieved. 147: * @exception org.xml.sax.SAXNotSupportedException When the 148: * XMLReader recognizes the feature name but 149: * cannot set the requested value. 150: * @see #getFeature 151: */ 152: public void setFeature (String name, boolean value) 153: throws SAXNotRecognizedException, SAXNotSupportedException; 154: 155: 156: /** 157: * Look up the value of a property. 158: * 159: * <p>The property name is any fully-qualified URI. It is 160: * possible for an XMLReader to recognize a property name but 161: * temporarily be unable to return its value. 162: * Some property values may be available only in specific 163: * contexts, such as before, during, or after a parse.</p> 164: * 165: * <p>XMLReaders are not required to recognize any specific 166: * property names, though an initial core set is documented for 167: * SAX2.</p> 168: * 169: * <p>Implementors are free (and encouraged) to invent their own properties, 170: * using names built on their own URIs.</p> 171: * 172: * @param name The property name, which is a fully-qualified URI. 173: * @return The current value of the property. 174: * @exception org.xml.sax.SAXNotRecognizedException If the property 175: * value can't be assigned or retrieved. 176: * @exception org.xml.sax.SAXNotSupportedException When the 177: * XMLReader recognizes the property name but 178: * cannot determine its value at this time. 179: * @see #setProperty 180: */ 181: public Object getProperty (String name) 182: throws SAXNotRecognizedException, SAXNotSupportedException; 183: 184: 185: /** 186: * Set the value of a property. 187: * 188: * <p>The property name is any fully-qualified URI. It is 189: * possible for an XMLReader to recognize a property name but 190: * to be unable to change the current value. 191: * Some property values may be immutable or mutable only 192: * in specific contexts, such as before, during, or after 193: * a parse.</p> 194: * 195: * <p>XMLReaders are not required to recognize setting 196: * any specific property names, though a core set is defined by 197: * SAX2.</p> 198: * 199: * <p>This method is also the standard mechanism for setting 200: * extended handlers.</p> 201: * 202: * @param name The property name, which is a fully-qualified URI. 203: * @param value The requested value for the property. 204: * @exception org.xml.sax.SAXNotRecognizedException If the property 205: * value can't be assigned or retrieved. 206: * @exception org.xml.sax.SAXNotSupportedException When the 207: * XMLReader recognizes the property name but 208: * cannot set the requested value. 209: */ 210: public void setProperty (String name, Object value) 211: throws SAXNotRecognizedException, SAXNotSupportedException; 212: 213: 214: 215: //////////////////////////////////////////////////////////////////// 216: // Event handlers. 217: //////////////////////////////////////////////////////////////////// 218: 219: 220: /** 221: * Allow an application to register an entity resolver. 222: * 223: * <p>If the application does not register an entity resolver, 224: * the XMLReader will perform its own default resolution.</p> 225: * 226: * <p>Applications may register a new or different resolver in the 227: * middle of a parse, and the SAX parser must begin using the new 228: * resolver immediately.</p> 229: * 230: * @param resolver The entity resolver. 231: * @see #getEntityResolver 232: */ 233: public void setEntityResolver (EntityResolver resolver); 234: 235: 236: /** 237: * Return the current entity resolver. 238: * 239: * @return The current entity resolver, or null if none 240: * has been registered. 241: * @see #setEntityResolver 242: */ 243: public EntityResolver getEntityResolver (); 244: 245: 246: /** 247: * Allow an application to register a DTD event handler. 248: * 249: * <p>If the application does not register a DTD handler, all DTD 250: * events reported by the SAX parser will be silently ignored.</p> 251: * 252: * <p>Applications may register a new or different handler in the 253: * middle of a parse, and the SAX parser must begin using the new 254: * handler immediately.</p> 255: * 256: * @param handler The DTD handler. 257: * @see #getDTDHandler 258: */ 259: public void setDTDHandler (DTDHandler handler); 260: 261: 262: /** 263: * Return the current DTD handler. 264: * 265: * @return The current DTD handler, or null if none 266: * has been registered. 267: * @see #setDTDHandler 268: */ 269: public DTDHandler getDTDHandler (); 270: 271: 272: /** 273: * Allow an application to register a content event handler. 274: * 275: * <p>If the application does not register a content handler, all 276: * content events reported by the SAX parser will be silently 277: * ignored.</p> 278: * 279: * <p>Applications may register a new or different handler in the 280: * middle of a parse, and the SAX parser must begin using the new 281: * handler immediately.</p> 282: * 283: * @param handler The content handler. 284: * @see #getContentHandler 285: */ 286: public void setContentHandler (ContentHandler handler); 287: 288: 289: /** 290: * Return the current content handler. 291: * 292: * @return The current content handler, or null if none 293: * has been registered. 294: * @see #setContentHandler 295: */ 296: public ContentHandler getContentHandler (); 297: 298: 299: /** 300: * Allow an application to register an error event handler. 301: * 302: * <p>If the application does not register an error handler, all 303: * error events reported by the SAX parser will be silently 304: * ignored; however, normal processing may not continue. It is 305: * highly recommended that all SAX applications implement an 306: * error handler to avoid unexpected bugs.</p> 307: * 308: * <p>Applications may register a new or different handler in the 309: * middle of a parse, and the SAX parser must begin using the new 310: * handler immediately.</p> 311: * 312: * @param handler The error handler. 313: * @see #getErrorHandler 314: */ 315: public void setErrorHandler (ErrorHandler handler); 316: 317: 318: /** 319: * Return the current error handler. 320: * 321: * @return The current error handler, or null if none 322: * has been registered. 323: * @see #setErrorHandler 324: */ 325: public ErrorHandler getErrorHandler (); 326: 327: 328: 329: //////////////////////////////////////////////////////////////////// 330: // Parsing. 331: //////////////////////////////////////////////////////////////////// 332: 333: /** 334: * Parse an XML document. 335: * 336: * <p>The application can use this method to instruct the XML 337: * reader to begin parsing an XML document from any valid input 338: * source (a character stream, a byte stream, or a URI).</p> 339: * 340: * <p>Applications may not invoke this method while a parse is in 341: * progress (they should create a new XMLReader instead for each 342: * nested XML document). Once a parse is complete, an 343: * application may reuse the same XMLReader object, possibly with a 344: * different input source. 345: * Configuration of the XMLReader object (such as handler bindings and 346: * values established for feature flags and properties) is unchanged 347: * by completion of a parse, unless the definition of that aspect of 348: * the configuration explicitly specifies other behavior. 349: * (For example, feature flags or properties exposing 350: * characteristics of the document being parsed.) 351: * </p> 352: * 353: * <p>During the parse, the XMLReader will provide information 354: * about the XML document through the registered event 355: * handlers.</p> 356: * 357: * <p>This method is synchronous: it will not return until parsing 358: * has ended. If a client application wants to terminate 359: * parsing early, it should throw an exception.</p> 360: * 361: * @param input The input source for the top-level of the 362: * XML document. 363: * @exception org.xml.sax.SAXException Any SAX exception, possibly 364: * wrapping another exception. 365: * @exception java.io.IOException An IO exception from the parser, 366: * possibly from a byte stream or character stream 367: * supplied by the application. 368: * @see org.xml.sax.InputSource 369: * @see #parse(java.lang.String) 370: * @see #setEntityResolver 371: * @see #setDTDHandler 372: * @see #setContentHandler 373: * @see #setErrorHandler 374: */ 375: public void parse (InputSource input) 376: throws IOException, SAXException; 377: 378: 379: /** 380: * Parse an XML document from a system identifier (URI). 381: * 382: * <p>This method is a shortcut for the common case of reading a 383: * document from a system identifier. It is the exact 384: * equivalent of the following:</p> 385: * 386: * <pre> 387: * parse(new InputSource(systemId)); 388: * </pre> 389: * 390: * <p>If the system identifier is a URL, it must be fully resolved 391: * by the application before it is passed to the parser.</p> 392: * 393: * @param systemId The system identifier (URI). 394: * @exception org.xml.sax.SAXException Any SAX exception, possibly 395: * wrapping another exception. 396: * @exception java.io.IOException An IO exception from the parser, 397: * possibly from a byte stream or character stream 398: * supplied by the application. 399: * @see #parse(org.xml.sax.InputSource) 400: */ 401: public void parse (String systemId) 402: throws IOException, SAXException; 403: 404: }