2021-01-30 07:51:39 +01:00
|
|
|
//
|
|
|
|
// XMLReader.h
|
|
|
|
//
|
|
|
|
// Library: XML
|
|
|
|
// Package: SAX
|
|
|
|
// Module: SAX
|
|
|
|
//
|
|
|
|
// SAX2 XMLReader Interface.
|
|
|
|
//
|
|
|
|
// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
|
|
|
|
// and Contributors.
|
|
|
|
//
|
|
|
|
// SPDX-License-Identifier: BSL-1.0
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef SAX_XMLReader_INCLUDED
|
|
|
|
#define SAX_XMLReader_INCLUDED
|
|
|
|
|
|
|
|
|
|
|
|
#include "Poco/XML/XML.h"
|
|
|
|
#include "Poco/XML/XMLString.h"
|
|
|
|
|
|
|
|
|
|
|
|
namespace Poco {
|
|
|
|
namespace XML {
|
|
|
|
|
|
|
|
|
|
|
|
class EntityResolver;
|
|
|
|
class DTDHandler;
|
|
|
|
class ContentHandler;
|
|
|
|
class ErrorHandler;
|
|
|
|
class InputSource;
|
|
|
|
class LexicalHandler;
|
|
|
|
class NamespaceHandler;
|
|
|
|
|
|
|
|
|
|
|
|
class XML_API XMLReader
|
2023-03-23 19:19:11 +01:00
|
|
|
/// Interface for reading an XML document using callbacks.
|
|
|
|
/// XMLReader is the interface that an XML parser's SAX2 driver must
|
2021-01-30 07:51:39 +01:00
|
|
|
/// implement. This interface allows an application to set and
|
2023-03-23 19:19:11 +01:00
|
|
|
/// query features and properties in the parser, to register event handlers
|
2021-01-30 07:51:39 +01:00
|
|
|
/// for document processing, and to initiate a document parse.
|
2023-03-23 19:19:11 +01:00
|
|
|
/// All SAX interfaces are assumed to be synchronous: the parse methods must not
|
2021-01-30 07:51:39 +01:00
|
|
|
/// return until parsing is complete, and readers
|
|
|
|
/// must wait for an event-handler callback to return before reporting the next event.
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
virtual void setEntityResolver(EntityResolver* pResolver) = 0;
|
|
|
|
/// Allow an application to register an entity resolver.
|
|
|
|
///
|
2023-03-23 19:19:11 +01:00
|
|
|
/// If the application does not register an entity resolver, the
|
2021-01-30 07:51:39 +01:00
|
|
|
/// XMLReader will perform its own default resolution.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// Applications may register a new or different resolver in the middle of a
|
2021-01-30 07:51:39 +01:00
|
|
|
/// parse, and the SAX parser must begin using the new resolver immediately.
|
|
|
|
|
|
|
|
virtual EntityResolver* getEntityResolver() const = 0;
|
|
|
|
/// Return the current entity resolver.
|
|
|
|
|
|
|
|
virtual void setDTDHandler(DTDHandler* pDTDHandler) = 0;
|
|
|
|
/// Allow an application to register a DTD event handler.
|
|
|
|
///
|
2023-03-23 19:19:11 +01:00
|
|
|
/// If the application does not register a DTD handler, all DTD events reported by
|
2021-01-30 07:51:39 +01:00
|
|
|
/// the SAX parser will be silently ignored.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// Applications may register a new or different handler in the middle of a parse,
|
2021-01-30 07:51:39 +01:00
|
|
|
/// and the SAX parser must begin using the new handler immediately.
|
|
|
|
|
|
|
|
virtual DTDHandler* getDTDHandler() const = 0;
|
|
|
|
/// Return the current DTD handler.
|
|
|
|
|
|
|
|
virtual void setContentHandler(ContentHandler* pContentHandler) = 0;
|
|
|
|
/// Allow an application to register a content event handler.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// If the application does not register a content handler, all content events
|
2021-01-30 07:51:39 +01:00
|
|
|
/// reported by the SAX parser will be silently ignored.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// Applications may register a new or different handler in the middle of a parse,
|
2021-01-30 07:51:39 +01:00
|
|
|
/// and the SAX parser must begin using the new handler immediately.
|
|
|
|
|
|
|
|
virtual ContentHandler* getContentHandler() const = 0;
|
|
|
|
/// Return the current content handler.
|
|
|
|
|
|
|
|
virtual void setErrorHandler(ErrorHandler* pErrorHandler) = 0;
|
|
|
|
/// Allow an application to register an error event handler.
|
|
|
|
///
|
2023-03-23 19:19:11 +01:00
|
|
|
/// 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
|
2021-01-30 07:51:39 +01:00
|
|
|
/// unexpected bugs.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// Applications may register a new or different handler in the middle of a parse, and the
|
2021-01-30 07:51:39 +01:00
|
|
|
/// SAX parser must begin using the new handler immediately.
|
|
|
|
|
|
|
|
virtual ErrorHandler* getErrorHandler() const = 0;
|
|
|
|
/// Return the current error handler.
|
2023-03-23 19:19:11 +01:00
|
|
|
|
2021-01-30 07:51:39 +01:00
|
|
|
virtual void setFeature(const XMLString& featureId, bool state) = 0;
|
|
|
|
/// Set the state of a feature.
|
|
|
|
///
|
2023-03-23 19:19:11 +01:00
|
|
|
/// 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,
|
2021-01-30 07:51:39 +01:00
|
|
|
/// or after a parse.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// All XMLReaders are required to support setting http://xml.org/sax/features/namespaces
|
2021-01-30 07:51:39 +01:00
|
|
|
/// to true and http://xml.org/sax/features/namespace-prefixes to false.
|
|
|
|
|
|
|
|
virtual bool getFeature(const XMLString& featureId) const = 0;
|
|
|
|
/// Look up the value of a feature.
|
|
|
|
///
|
2023-03-23 19:19:11 +01:00
|
|
|
/// 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 Parser, there is no
|
|
|
|
/// implementation-independent way to expose whether the underlying parser is performing
|
2021-01-30 07:51:39 +01:00
|
|
|
/// validation, expanding external entities, and so forth.)
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// All XMLReaders are required to recognize the
|
|
|
|
/// http://xml.org/sax/features/namespaces and the
|
2021-01-30 07:51:39 +01:00
|
|
|
/// http://xml.org/sax/features/namespace-prefixes feature names.
|
2023-03-23 19:19:11 +01:00
|
|
|
/// Implementors are free (and encouraged) to invent their own features,
|
2021-01-30 07:51:39 +01:00
|
|
|
/// using names built on their own URIs.
|
2023-03-23 19:19:11 +01:00
|
|
|
|
2021-01-30 07:51:39 +01:00
|
|
|
virtual void setProperty(const XMLString& propertyId, const XMLString& value) = 0;
|
|
|
|
/// Set the value of a property.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// 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,
|
2021-01-30 07:51:39 +01:00
|
|
|
/// such as before, during, or after a parse.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// XMLReaders are not required to recognize setting any specific property names, though a
|
2021-01-30 07:51:39 +01:00
|
|
|
/// core set is defined by SAX2.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
2021-01-30 07:51:39 +01:00
|
|
|
/// This method is also the standard mechanism for setting extended handlers.
|
|
|
|
|
|
|
|
virtual void setProperty(const XMLString& propertyId, void* value) = 0;
|
|
|
|
/// Set the value of a property.
|
|
|
|
/// See also setProperty(const XMLString&, const XMLString&).
|
|
|
|
|
|
|
|
virtual void* getProperty(const XMLString& propertyId) const = 0;
|
|
|
|
/// Look up the value of a property.
|
|
|
|
/// String values are returned as XMLChar*
|
2023-03-23 19:19:11 +01:00
|
|
|
/// 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
|
2021-01-30 07:51:39 +01:00
|
|
|
/// values may be available only in specific contexts, such as before, during, or after a parse.
|
|
|
|
///
|
2023-03-23 19:19:11 +01:00
|
|
|
/// XMLReaders are not required to recognize any specific property names, though an initial
|
2021-01-30 07:51:39 +01:00
|
|
|
/// core set is documented for SAX2.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// Implementors are free (and encouraged) to invent their own properties, using names
|
2021-01-30 07:51:39 +01:00
|
|
|
/// built on their own URIs.
|
|
|
|
|
|
|
|
virtual void parse(InputSource* pSource) = 0;
|
|
|
|
/// Parse an XML document.
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// The application can use this method to instruct the XML reader to begin parsing an
|
2021-01-30 07:51:39 +01:00
|
|
|
/// XML document from any valid input source (a character stream, a byte stream, or a URI).
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// 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
|
2021-01-30 07:51:39 +01:00
|
|
|
/// properties exposing characteristics of the document being parsed.)
|
2023-03-23 19:19:11 +01:00
|
|
|
///
|
|
|
|
/// During the parse, the XMLReader will provide information about the XML document through the registered
|
2021-01-30 07:51:39 +01:00
|
|
|
/// event handlers.
|
|
|
|
///
|
2023-03-23 19:19:11 +01:00
|
|
|
/// This method is synchronous: it will not return until parsing has ended. If a client application
|
2021-01-30 07:51:39 +01:00
|
|
|
/// wants to terminate parsing early, it should throw an exception.
|
|
|
|
|
|
|
|
virtual void parse(const XMLString& systemId) = 0;
|
|
|
|
/// Parse an XML document from a system identifier.
|
|
|
|
/// See also parse(InputSource*).
|
2023-03-23 19:19:11 +01:00
|
|
|
|
2021-01-30 07:51:39 +01:00
|
|
|
virtual void parseMemoryNP(const char* xml, std::size_t size) = 0;
|
|
|
|
/// Parse an XML document from memory.
|
|
|
|
/// See also parse(InputSource*).
|
|
|
|
|
|
|
|
// SAX Features
|
|
|
|
static const XMLString FEATURE_VALIDATION;
|
|
|
|
static const XMLString FEATURE_NAMESPACES;
|
|
|
|
static const XMLString FEATURE_NAMESPACE_PREFIXES;
|
|
|
|
static const XMLString FEATURE_EXTERNAL_GENERAL_ENTITIES;
|
|
|
|
static const XMLString FEATURE_EXTERNAL_PARAMETER_ENTITIES;
|
|
|
|
static const XMLString FEATURE_STRING_INTERNING;
|
2023-03-23 19:19:11 +01:00
|
|
|
|
2021-01-30 07:51:39 +01:00
|
|
|
// SAX Properties
|
|
|
|
static const XMLString PROPERTY_DECLARATION_HANDLER;
|
|
|
|
static const XMLString PROPERTY_LEXICAL_HANDLER;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual ~XMLReader();
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
} } // namespace Poco::XML
|
|
|
|
|
|
|
|
|
|
|
|
#endif // SAX_XMLReader_INCLUDED
|