123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- //
- // ContentHandler.h
- //
- // Library: XML
- // Package: SAX
- // Module: SAX
- //
- // SAX2 ContentHandler Interface.
- //
- // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH.
- // and Contributors.
- //
- // SPDX-License-Identifier: BSL-1.0
- //
- #ifndef SAX_ContentHandler_INCLUDED
- #define SAX_ContentHandler_INCLUDED
- #include "Poco/XML/XML.h"
- #include "Poco/XML/XMLString.h"
- namespace Poco {
- namespace XML {
- class Locator;
- class Attributes;
- class XML_API ContentHandler
- /// Receive notification of the logical content of a document.
- ///
- /// This is the main interface that most SAX applications implement: if the
- /// application needs to be informed of basic parsing events, it implements
- /// this interface and registers an instance with the SAX parser using the setContentHandler
- /// method. The parser uses the instance to report basic document-related events
- /// like the start and end of elements and character data.
- ///
- /// The order of events in this interface is very important, and mirrors the
- /// order of information in the document itself. For example, all of an element's
- /// content (character data, processing instructions, and/or subelements) will
- /// appear, in order, between the startElement event and the corresponding endElement
- /// event.
- ///
- /// This interface is similar to the now-deprecated SAX 1.0 DocumentHandler
- /// interface, but it adds support for Namespaces and for reporting skipped
- /// entities (in non-validating XML processors).
- /// Receive notification of the logical content of a document.
- {
- public:
- virtual void setDocumentLocator(const Locator* loc) = 0;
- /// Receive an object for locating the origin of SAX document events.
- ///
- /// SAX parsers are strongly encouraged (though not absolutely required) to
- /// supply a locator: if it does so, it must supply the locator to the application
- /// by invoking this method before invoking any of the other methods in the
- /// ContentHandler interface.
- ///
- /// The locator allows the application to determine the end position of any
- /// document-related event, even if the parser is not reporting an error. Typically,
- /// the application will use this information for reporting its own errors (such
- /// as character content that does not match an application's business rules).
- /// The information returned by the locator is probably not sufficient for use
- /// with a search engine.
- ///
- /// Note that the locator will return correct information only during the invocation
- /// SAX event callbacks after startDocument returns and before endDocument is
- /// called. The application should not attempt to use it at any other time.
- virtual void startDocument() = 0;
- /// Receive notification of the beginning of a document.
- ///
- /// The SAX parser calls this function one time before calling all other
- /// functions of this class (except SetDocumentLocator).
- virtual void endDocument() = 0;
- /// Receive notification of the end of a document.
- ///
- /// The SAX parser will invoke this method only once, and it will be the last
- /// method invoked during the parse. The parser shall not invoke this method
- /// until it has either abandoned parsing (because of an unrecoverable error)
- /// or reached the end of input.
- virtual void startElement(const XMLString& uri, const XMLString& localName, const XMLString& qname, const Attributes& attrList) = 0;
- /// Receive notification of the beginning of an element.
- ///
- /// The Parser will invoke this method at the beginning of every element in
- /// the XML document; there will be a corresponding endElement event for every
- /// startElement event (even when the element is empty). All of the element's
- /// content will be reported, in order, before the corresponding endElement
- /// event.
- ///
- /// This event allows up to three name components for each element:
- /// 1. the Namespace URI;
- /// 2. the local name; and
- /// 3. the qualified (prefixed) name.
- ///
- /// Any or all of these may be provided, depending on the values of the http://xml.org/sax/features/namespaces
- /// and the http://xml.org/sax/features/namespace-prefixes properties:
- /// * the Namespace URI and local name are required when the namespaces
- /// property is true (the default), and are optional when the namespaces property
- /// is false (if one is specified, both must be);
- /// * the qualified name is required when the namespace-prefixes property
- /// is true, and is optional when the namespace-prefixes property is false (the
- /// default).
- ///
- /// Note that the attribute list provided will contain only attributes with
- /// explicit values (specified or defaulted): #IMPLIED attributes will be omitted.
- /// The attribute list will contain attributes used for Namespace declarations
- /// (xmlns* attributes) only if the http://xml.org/sax/features/namespace-prefixes
- /// property is true (it is false by default, and support for a true value is
- /// optional).
- ///
- /// Like characters(), attribute values may have characters that need more than
- /// one char value.
- virtual void endElement(const XMLString& uri, const XMLString& localName, const XMLString& qname) = 0;
- /// Receive notification of the end of an element.
- ///
- /// The SAX parser will invoke this method at the end of every element in the
- /// XML document; there will be a corresponding startElement event for every
- /// endElement event (even when the element is empty).
- ///
- /// For information on the names, see startElement.
- virtual void characters(const XMLChar ch[], int start, int length) = 0;
- /// Receive notification of character data.
- ///
- /// The Parser will call this method to report each chunk of character data.
- /// SAX parsers may return all contiguous character data in a single chunk,
- /// or they may split it into several chunks; however, all of the characters
- /// in any single event must come from the same external entity so that the
- /// Locator provides useful information.
- ///
- /// The application must not attempt to read from the array outside of the specified
- /// range.
- ///
- /// Individual characters may consist of more than one XMLChar value. There
- /// are three important cases where this happens, because characters can't be
- /// represented in just sixteen bits. In one case, characters are represented
- /// in a Surrogate Pair, using two special Unicode values. Such characters are
- /// in the so-called "Astral Planes", with a code point above U+FFFF. A second
- /// case involves composite characters, such as a base character combining with
- /// one or more accent characters. And most important, if XMLChar is a plain
- /// char, characters are encoded in UTF-8.
- ///
- /// Your code should not assume that algorithms using char-at-a-time idioms
- /// will be working in character units; in some cases they will split characters.
- /// This is relevant wherever XML permits arbitrary characters, such as attribute
- /// values, processing instruction data, and comments as well as in data reported
- /// from this method. It's also generally relevant whenever C++ code manipulates
- /// internationalized text; the issue isn't unique to XML.
- ///
- /// Note that some parsers will report whitespace in element content using the
- /// ignorableWhitespace method rather than this one (validating parsers must
- /// do so).
- virtual void ignorableWhitespace(const XMLChar ch[], int start, int length) = 0;
- /// Receive notification of ignorable whitespace in element content.
- ///
- /// Validating Parsers must use this method to report each chunk of whitespace
- /// in element content (see the W3C XML 1.0 recommendation, section 2.10): non-validating
- /// parsers may also use this method if they are capable of parsing and using
- /// content models.
- ///
- /// SAX parsers may return all contiguous whitespace in a single chunk, or they
- /// may split it into several chunks; however, all of the characters in any
- /// single event must come from the same external entity, so that the Locator
- /// provides useful information.
- ///
- /// The application must not attempt to read from the array outside of the specified
- /// range.
- virtual void processingInstruction(const XMLString& target, const XMLString& data) = 0;
- /// Receive notification of a processing instruction.
- ///
- /// The Parser will invoke this method once for each processing instruction
- /// found: note that processing instructions may occur before or after the main
- /// document element.
- ///
- /// A SAX parser must never report an XML declaration (XML 1.0, section 2.8)
- /// or a text declaration (XML 1.0, section 4.3.1) using this method.
- ///
- /// Like characters(), processing instruction data may have characters that
- /// need more than one char value.
- virtual void startPrefixMapping(const XMLString& prefix, const XMLString& uri) = 0;
- /// Begin the scope of a prefix-URI Namespace mapping.
- ///
- /// The information from this event is not necessary for normal Namespace processing:
- /// the SAX XML reader will automatically replace prefixes for element and attribute
- /// names when the http://xml.org/sax/features/namespaces feature is true (the
- /// default).
- ///
- /// There are cases, however, when applications need to use prefixes in character
- /// data or in attribute values, where they cannot safely be expanded automatically;
- /// the start/endPrefixMapping event supplies the information to the application
- /// to expand prefixes in those contexts itself, if necessary.
- ///
- /// Note that start/endPrefixMapping events are not guaranteed to be properly
- /// nested relative to each other: all startPrefixMapping events will occur
- /// immediately before the corresponding startElement event, and all endPrefixMapping
- /// events will occur immediately after the corresponding endElement event,
- /// but their order is not otherwise guaranteed.
- ///
- /// There should never be start/endPrefixMapping events for the "xml" prefix,
- /// since it is predeclared and immutable.
- virtual void endPrefixMapping(const XMLString& prefix) = 0;
- /// End the scope of a prefix-URI mapping.
- ///
- /// See startPrefixMapping for details. These events will always occur immediately
- /// after the corresponding endElement event, but the order of endPrefixMapping
- /// events is not otherwise guaranteed.
- virtual void skippedEntity(const XMLString& name) = 0;
- /// Receive notification of a skipped entity. This is not called for entity
- /// references within markup constructs such as element start tags or markup
- /// declarations. (The XML recommendation requires reporting skipped external
- /// entities. SAX also reports internal entity expansion/non-expansion, except
- /// within markup constructs.)
- ///
- /// The Parser will invoke this method each time the entity is skipped. Non-validating
- /// processors may skip entities if they have not seen the declarations (because,
- /// for example, the entity was declared in an external DTD subset). All processors
- /// may skip external entities, depending on the values of the http://xml.org/sax/features/external-general-entities
- /// and the http://xml.org/sax/features/external-parameter-entities properties.
- protected:
- virtual ~ContentHandler();
- };
- } } // namespace Poco::XML
- #endif // SAX_ContentHandler_INCLUDED
|