/* |
|
* Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. |
|
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. |
|
* |
|
* This code is free software; you can redistribute it and/or modify it |
|
* under the terms of the GNU General Public License version 2 only, as |
|
* published by the Free Software Foundation. Oracle designates this |
|
* particular file as subject to the "Classpath" exception as provided |
|
* by Oracle in the LICENSE file that accompanied this code. |
|
* |
|
* This code is distributed in the hope that it will be useful, but WITHOUT |
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
|
* version 2 for more details (a copy is included in the LICENSE file that |
|
* accompanied this code). |
|
* |
|
* You should have received a copy of the GNU General Public License version |
|
* 2 along with this work; if not, write to the Free Software Foundation, |
|
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. |
|
* |
|
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA |
|
* or visit www.oracle.com if you need additional information or have any |
|
* questions. |
|
*/ |
|
package org.xml.sax; |
|
import java.io.IOException; |
|
/** |
|
* Interface for reading an XML document using callbacks. |
|
* |
|
* |
|
* <p>XMLReader is the interface that an XML parser's SAX2 driver must |
|
* implement. This interface allows an application to set and |
|
* query features and properties in the parser, to register |
|
* event handlers for document processing, and to initiate |
|
* a document parse.</p> |
|
* |
|
* <p>All SAX interfaces are assumed to be synchronous: the |
|
* {@link #parse parse} methods must not return until parsing |
|
* is complete, and readers must wait for an event-handler callback |
|
* to return before reporting the next event.</p> |
|
* |
|
* <p>This interface replaces the (now deprecated) SAX 1.0 {@link |
|
* org.xml.sax.Parser Parser} interface. The XMLReader interface |
|
* contains two important enhancements over the old Parser |
|
* interface (as well as some minor ones):</p> |
|
* |
|
* <ol> |
|
* <li>it adds a standard way to query and set features and |
|
* properties; and</li> |
|
* <li>it adds Namespace support, which is required for many |
|
* higher-level XML standards.</li> |
|
* </ol> |
|
* |
|
* <p>There are adapters available to convert a SAX1 Parser to |
|
* a SAX2 XMLReader and vice-versa.</p> |
|
* |
|
* @apiNote Despite its name, this interface does |
|
* <em>not</em> extend the standard Java {@link java.io.Reader Reader} |
|
* interface, because reading XML is a fundamentally different activity |
|
* than reading character data. |
|
* |
|
* @since 1.4, SAX 2.0 |
|
* @author David Megginson |
|
* @see org.xml.sax.XMLFilter |
|
* @see org.xml.sax.helpers.ParserAdapter |
|
* @see org.xml.sax.helpers.XMLReaderAdapter |
|
*/ |
|
public interface XMLReader |
|
{ |
|
//////////////////////////////////////////////////////////////////// |
|
// Configuration. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Look up the value of a feature flag. |
|
* |
|
* <p>The feature name is any fully-qualified URI. It is |
|
* possible for an XMLReader to recognize a feature name but |
|
* temporarily be unable to return its value. |
|
* Some feature values may be available only in specific |
|
* contexts, such as before, during, or after a parse. |
|
* Also, some feature values may not be programmatically accessible. |
|
* (In the case of an adapter for SAX1 {@link Parser}, there is no |
|
* implementation-independent way to expose whether the underlying |
|
* parser is performing validation, expanding external entities, |
|
* and so forth.) </p> |
|
* |
|
* <p>All XMLReaders are required to recognize the |
|
* http://xml.org/sax/features/namespaces and the |
|
* http://xml.org/sax/features/namespace-prefixes feature names.</p> |
|
* |
|
* <p>Typical usage is something like this:</p> |
|
* |
|
* <pre> |
|
* XMLReader r = new MySAXDriver(); |
|
* |
|
* // try to activate validation |
|
* try { |
|
* r.setFeature("http://xml.org/sax/features/validation", true); |
|
* } catch (SAXException e) { |
|
* System.err.println("Cannot activate validation."); |
|
* } |
|
* |
|
* // register event handlers |
|
* r.setContentHandler(new MyContentHandler()); |
|
* r.setErrorHandler(new MyErrorHandler()); |
|
* |
|
* // parse the first document |
|
* try { |
|
* r.parse("http://www.foo.com/mydoc.xml"); |
|
* } catch (IOException e) { |
|
* System.err.println("I/O exception reading XML document"); |
|
* } catch (SAXException e) { |
|
* System.err.println("XML exception reading document."); |
|
* } |
|
* </pre> |
|
* |
|
* <p>Implementors are free (and encouraged) to invent their own features, |
|
* using names built on their own URIs.</p> |
|
* |
|
* @param name The feature name, which is a fully-qualified URI. |
|
* @return The current value of the feature (true or false). |
|
* @throws org.xml.sax.SAXNotRecognizedException If the feature |
|
* value can't be assigned or retrieved. |
|
* @throws org.xml.sax.SAXNotSupportedException When the |
|
* XMLReader recognizes the feature name but |
|
* cannot determine its value at this time. |
|
* @see #setFeature |
|
*/ |
|
public boolean getFeature (String name) |
|
throws SAXNotRecognizedException, SAXNotSupportedException; |
|
/** |
|
* Set the value of a feature flag. |
|
* |
|
* <p>The feature name is any fully-qualified URI. It is |
|
* possible for an XMLReader to expose a feature value but |
|
* to be unable to change the current value. |
|
* Some feature values may be immutable or mutable only |
|
* in specific contexts, such as before, during, or after |
|
* a parse.</p> |
|
* |
|
* <p>All XMLReaders are required to support setting |
|
* http://xml.org/sax/features/namespaces to true and |
|
* http://xml.org/sax/features/namespace-prefixes to false.</p> |
|
* |
|
* @param name The feature name, which is a fully-qualified URI. |
|
* @param value The requested value of the feature (true or false). |
|
* @throws org.xml.sax.SAXNotRecognizedException If the feature |
|
* value can't be assigned or retrieved. |
|
* @throws org.xml.sax.SAXNotSupportedException When the |
|
* XMLReader recognizes the feature name but |
|
* cannot set the requested value. |
|
* @see #getFeature |
|
*/ |
|
public void setFeature (String name, boolean value) |
|
throws SAXNotRecognizedException, SAXNotSupportedException; |
|
/** |
|
* Look up the value of a property. |
|
* |
|
* <p>The property name is any fully-qualified URI. It is |
|
* possible for an XMLReader to recognize a property name but |
|
* temporarily be unable to return its value. |
|
* Some property values may be available only in specific |
|
* contexts, such as before, during, or after a parse.</p> |
|
* |
|
* <p>XMLReaders are not required to recognize any specific |
|
* property names, though an initial core set is documented for |
|
* SAX2.</p> |
|
* |
|
* <p>Implementors are free (and encouraged) to invent their own properties, |
|
* using names built on their own URIs.</p> |
|
* |
|
* @param name The property name, which is a fully-qualified URI. |
|
* @return The current value of the property. |
|
* @throws org.xml.sax.SAXNotRecognizedException If the property |
|
* value can't be assigned or retrieved. |
|
* @throws org.xml.sax.SAXNotSupportedException When the |
|
* XMLReader recognizes the property name but |
|
* cannot determine its value at this time. |
|
* @see #setProperty |
|
*/ |
|
public Object getProperty (String name) |
|
throws SAXNotRecognizedException, SAXNotSupportedException; |
|
/** |
|
* Set the value of a property. |
|
* |
|
* <p>The property name is any fully-qualified URI. It is |
|
* possible for an XMLReader to recognize a property name but |
|
* to be unable to change the current value. |
|
* Some property values may be immutable or mutable only |
|
* in specific contexts, such as before, during, or after |
|
* a parse.</p> |
|
* |
|
* <p>XMLReaders are not required to recognize setting |
|
* any specific property names, though a core set is defined by |
|
* SAX2.</p> |
|
* |
|
* <p>This method is also the standard mechanism for setting |
|
* extended handlers.</p> |
|
* |
|
* @param name The property name, which is a fully-qualified URI. |
|
* @param value The requested value for the property. |
|
* @throws org.xml.sax.SAXNotRecognizedException If the property |
|
* value can't be assigned or retrieved. |
|
* @throws org.xml.sax.SAXNotSupportedException When the |
|
* XMLReader recognizes the property name but |
|
* cannot set the requested value. |
|
*/ |
|
public void setProperty (String name, Object value) |
|
throws SAXNotRecognizedException, SAXNotSupportedException; |
|
//////////////////////////////////////////////////////////////////// |
|
// Event handlers. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Allow an application to register an entity resolver. |
|
* |
|
* <p>If the application does not register an entity resolver, |
|
* the XMLReader will perform its own default resolution.</p> |
|
* |
|
* <p>Applications may register a new or different resolver in the |
|
* middle of a parse, and the SAX parser must begin using the new |
|
* resolver immediately.</p> |
|
* |
|
* @param resolver The entity resolver. |
|
* @see #getEntityResolver |
|
*/ |
|
public void setEntityResolver (EntityResolver resolver); |
|
/** |
|
* Return the current entity resolver. |
|
* |
|
* @return The current entity resolver, or null if none |
|
* has been registered. |
|
* @see #setEntityResolver |
|
*/ |
|
public EntityResolver getEntityResolver (); |
|
/** |
|
* Allow an application to register a DTD event handler. |
|
* |
|
* <p>If the application does not register a DTD handler, all DTD |
|
* events reported by the SAX parser will be silently ignored.</p> |
|
* |
|
* <p>Applications may register a new or different handler in the |
|
* middle of a parse, and the SAX parser must begin using the new |
|
* handler immediately.</p> |
|
* |
|
* @param handler The DTD handler. |
|
* @see #getDTDHandler |
|
*/ |
|
public void setDTDHandler (DTDHandler handler); |
|
/** |
|
* Return the current DTD handler. |
|
* |
|
* @return The current DTD handler, or null if none |
|
* has been registered. |
|
* @see #setDTDHandler |
|
*/ |
|
public DTDHandler getDTDHandler (); |
|
/** |
|
* Allow an application to register a content event handler. |
|
* |
|
* <p>If the application does not register a content handler, all |
|
* content events reported by the SAX parser will be silently |
|
* ignored.</p> |
|
* |
|
* <p>Applications may register a new or different handler in the |
|
* middle of a parse, and the SAX parser must begin using the new |
|
* handler immediately.</p> |
|
* |
|
* @param handler The content handler. |
|
* @see #getContentHandler |
|
*/ |
|
public void setContentHandler (ContentHandler handler); |
|
/** |
|
* Return the current content handler. |
|
* |
|
* @return The current content handler, or null if none |
|
* has been registered. |
|
* @see #setContentHandler |
|
*/ |
|
public ContentHandler getContentHandler (); |
|
/** |
|
* Allow an application to register an error event handler. |
|
* |
|
* <p>If the application does not register an error handler, all |
|
* error events reported by the SAX parser will be silently |
|
* ignored; however, normal processing may not continue. It is |
|
* highly recommended that all SAX applications implement an |
|
* error handler to avoid unexpected bugs.</p> |
|
* |
|
* <p>Applications may register a new or different handler in the |
|
* middle of a parse, and the SAX parser must begin using the new |
|
* handler immediately.</p> |
|
* |
|
* @param handler The error handler. |
|
* @see #getErrorHandler |
|
*/ |
|
public void setErrorHandler (ErrorHandler handler); |
|
/** |
|
* Return the current error handler. |
|
* |
|
* @return The current error handler, or null if none |
|
* has been registered. |
|
* @see #setErrorHandler |
|
*/ |
|
public ErrorHandler getErrorHandler (); |
|
//////////////////////////////////////////////////////////////////// |
|
// Parsing. |
|
//////////////////////////////////////////////////////////////////// |
|
/** |
|
* Parse an XML document. |
|
* |
|
* <p>The application can use this method to instruct the XML |
|
* reader to begin parsing an XML document from any valid input |
|
* source (a character stream, a byte stream, or a URI).</p> |
|
* |
|
* <p>Applications may not invoke this method while a parse is in |
|
* progress (they should create a new XMLReader instead for each |
|
* nested XML document). Once a parse is complete, an |
|
* application may reuse the same XMLReader object, possibly with a |
|
* different input source. |
|
* Configuration of the XMLReader object (such as handler bindings and |
|
* values established for feature flags and properties) is unchanged |
|
* by completion of a parse, unless the definition of that aspect of |
|
* the configuration explicitly specifies other behavior. |
|
* (For example, feature flags or properties exposing |
|
* characteristics of the document being parsed.) |
|
* </p> |
|
* |
|
* <p>During the parse, the XMLReader will provide information |
|
* about the XML document through the registered event |
|
* handlers.</p> |
|
* |
|
* <p>This method is synchronous: it will not return until parsing |
|
* has ended. If a client application wants to terminate |
|
* parsing early, it should throw an exception.</p> |
|
* |
|
* @param input The input source for the top-level of the |
|
* XML document. |
|
* @throws org.xml.sax.SAXException Any SAX exception, possibly |
|
* wrapping another exception. |
|
* @throws java.io.IOException An IO exception from the parser, |
|
* possibly from a byte stream or character stream |
|
* supplied by the application. |
|
* @see org.xml.sax.InputSource |
|
* @see #parse(java.lang.String) |
|
* @see #setEntityResolver |
|
* @see #setDTDHandler |
|
* @see #setContentHandler |
|
* @see #setErrorHandler |
|
*/ |
|
public void parse (InputSource input) |
|
throws IOException, SAXException; |
|
/** |
|
* Parse an XML document from a system identifier (URI). |
|
* |
|
* <p>This method is a shortcut for the common case of reading a |
|
* document from a system identifier. It is the exact |
|
* equivalent of the following:</p> |
|
* |
|
* <pre> |
|
* parse(new InputSource(systemId)); |
|
* </pre> |
|
* |
|
* <p>If the system identifier is a URL, it must be fully resolved |
|
* by the application before it is passed to the parser.</p> |
|
* |
|
* @param systemId The system identifier (URI). |
|
* @throws org.xml.sax.SAXException Any SAX exception, possibly |
|
* wrapping another exception. |
|
* @throws java.io.IOException An IO exception from the parser, |
|
* possibly from a byte stream or character stream |
|
* supplied by the application. |
|
* @see #parse(org.xml.sax.InputSource) |
|
*/ |
|
public void parse (String systemId) |
|
throws IOException, SAXException; |
|
} |