| 1 | // | 
|---|
| 2 | // ContentHandler.h | 
|---|
| 3 | // | 
|---|
| 4 | // Library: XML | 
|---|
| 5 | // Package: SAX | 
|---|
| 6 | // Module:  SAX | 
|---|
| 7 | // | 
|---|
| 8 | // SAX2 ContentHandler Interface. | 
|---|
| 9 | // | 
|---|
| 10 | // Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. | 
|---|
| 11 | // and Contributors. | 
|---|
| 12 | // | 
|---|
| 13 | // SPDX-License-Identifier:	BSL-1.0 | 
|---|
| 14 | // | 
|---|
| 15 |  | 
|---|
| 16 |  | 
|---|
| 17 | #ifndef SAX_ContentHandler_INCLUDED | 
|---|
| 18 | #define SAX_ContentHandler_INCLUDED | 
|---|
| 19 |  | 
|---|
| 20 |  | 
|---|
| 21 | #include "Poco/XML/XML.h" | 
|---|
| 22 | #include "Poco/XML/XMLString.h" | 
|---|
| 23 |  | 
|---|
| 24 |  | 
|---|
| 25 | namespace Poco { | 
|---|
| 26 | namespace XML { | 
|---|
| 27 |  | 
|---|
| 28 |  | 
|---|
| 29 | class Locator; | 
|---|
| 30 | class Attributes; | 
|---|
| 31 |  | 
|---|
| 32 |  | 
|---|
| 33 | class XML_API ContentHandler | 
|---|
| 34 | /// Receive notification of the logical content of a document. | 
|---|
| 35 | /// | 
|---|
| 36 | /// This is the main interface that most SAX applications implement: if the | 
|---|
| 37 | /// application needs to be informed of basic parsing events, it implements | 
|---|
| 38 | /// this interface and registers an instance with the SAX parser using the setContentHandler | 
|---|
| 39 | /// method. The parser uses the instance to report basic document-related events | 
|---|
| 40 | /// like the start and end of elements and character data. | 
|---|
| 41 | /// | 
|---|
| 42 | /// The order of events in this interface is very important, and mirrors the | 
|---|
| 43 | /// order of information in the document itself. For example, all of an element's | 
|---|
| 44 | /// content (character data, processing instructions, and/or subelements) will | 
|---|
| 45 | /// appear, in order, between the startElement event and the corresponding endElement | 
|---|
| 46 | /// event. | 
|---|
| 47 | /// | 
|---|
| 48 | /// This interface is similar to the now-deprecated SAX 1.0 DocumentHandler | 
|---|
| 49 | /// interface, but it adds support for Namespaces and for reporting skipped | 
|---|
| 50 | /// entities (in non-validating XML processors). | 
|---|
| 51 | /// Receive notification of the logical content of a document. | 
|---|
| 52 | { | 
|---|
| 53 | public: | 
|---|
| 54 | virtual void setDocumentLocator(const Locator* loc) = 0; | 
|---|
| 55 | /// Receive an object for locating the origin of SAX document events. | 
|---|
| 56 | /// | 
|---|
| 57 | /// SAX parsers are strongly encouraged (though not absolutely required) to | 
|---|
| 58 | /// supply a locator: if it does so, it must supply the locator to the application | 
|---|
| 59 | /// by invoking this method before invoking any of the other methods in the | 
|---|
| 60 | /// ContentHandler interface. | 
|---|
| 61 | /// | 
|---|
| 62 | /// The locator allows the application to determine the end position of any | 
|---|
| 63 | /// document-related event, even if the parser is not reporting an error. Typically, | 
|---|
| 64 | /// the application will use this information for reporting its own errors (such | 
|---|
| 65 | /// as character content that does not match an application's business rules). | 
|---|
| 66 | /// The information returned by the locator is probably not sufficient for use | 
|---|
| 67 | /// with a search engine. | 
|---|
| 68 | /// | 
|---|
| 69 | /// Note that the locator will return correct information only during the invocation | 
|---|
| 70 | /// SAX event callbacks after startDocument returns and before endDocument is | 
|---|
| 71 | /// called. The application should not attempt to use it at any other time. | 
|---|
| 72 |  | 
|---|
| 73 | virtual void startDocument() = 0; | 
|---|
| 74 | /// Receive notification of the beginning of a document. | 
|---|
| 75 | /// | 
|---|
| 76 | /// The SAX parser calls this function one time before calling all other | 
|---|
| 77 | /// functions of this class (except SetDocumentLocator). | 
|---|
| 78 |  | 
|---|
| 79 | virtual void endDocument() = 0; | 
|---|
| 80 | /// Receive notification of the end of a document. | 
|---|
| 81 | /// | 
|---|
| 82 | /// The SAX parser will invoke this method only once, and it will be the last | 
|---|
| 83 | /// method invoked during the parse. The parser shall not invoke this method | 
|---|
| 84 | /// until it has either abandoned parsing (because of an unrecoverable error) | 
|---|
| 85 | /// or reached the end of input. | 
|---|
| 86 |  | 
|---|
| 87 | virtual void startElement(const XMLString& uri, const XMLString& localName, const XMLString& qname, const Attributes& attrList) = 0; | 
|---|
| 88 | /// Receive notification of the beginning of an element. | 
|---|
| 89 | /// | 
|---|
| 90 | /// The Parser will invoke this method at the beginning of every element in | 
|---|
| 91 | /// the XML document; there will be a corresponding endElement event for every | 
|---|
| 92 | /// startElement event (even when the element is empty). All of the element's | 
|---|
| 93 | /// content will be reported, in order, before the corresponding endElement | 
|---|
| 94 | /// event. | 
|---|
| 95 | /// | 
|---|
| 96 | /// This event allows up to three name components for each element: | 
|---|
| 97 | ///    1. the Namespace URI; | 
|---|
| 98 | ///    2. the local name; and | 
|---|
| 99 | ///    3. the qualified (prefixed) name. | 
|---|
| 100 | /// | 
|---|
| 101 | /// Any or all of these may be provided, depending on the values of the http://xml.org/sax/features/namespaces | 
|---|
| 102 | /// and the http://xml.org/sax/features/namespace-prefixes properties: | 
|---|
| 103 | ///     * the Namespace URI and local name are required when the namespaces | 
|---|
| 104 | ///       property is true (the default), and are optional when the namespaces property | 
|---|
| 105 | ///       is false (if one is specified, both must be); | 
|---|
| 106 | ///     * the qualified name is required when the namespace-prefixes property | 
|---|
| 107 | ///       is true, and is optional when the namespace-prefixes property is false (the | 
|---|
| 108 | ///       default). | 
|---|
| 109 | /// | 
|---|
| 110 | /// Note that the attribute list provided will contain only attributes with | 
|---|
| 111 | /// explicit values (specified or defaulted): #IMPLIED attributes will be omitted. | 
|---|
| 112 | /// The attribute list will contain attributes used for Namespace declarations | 
|---|
| 113 | /// (xmlns* attributes) only if the http://xml.org/sax/features/namespace-prefixes | 
|---|
| 114 | /// property is true (it is false by default, and support for a true value is | 
|---|
| 115 | /// optional). | 
|---|
| 116 | /// | 
|---|
| 117 | /// Like characters(), attribute values may have characters that need more than | 
|---|
| 118 | /// one char value. | 
|---|
| 119 |  | 
|---|
| 120 | virtual void endElement(const XMLString& uri, const XMLString& localName, const XMLString& qname) = 0; | 
|---|
| 121 | /// Receive notification of the end of an element. | 
|---|
| 122 | /// | 
|---|
| 123 | /// The SAX parser will invoke this method at the end of every element in the | 
|---|
| 124 | /// XML document; there will be a corresponding startElement event for every | 
|---|
| 125 | /// endElement event (even when the element is empty). | 
|---|
| 126 | /// | 
|---|
| 127 | /// For information on the names, see startElement. | 
|---|
| 128 |  | 
|---|
| 129 | virtual void characters(const XMLChar ch[], int start, int length) = 0; | 
|---|
| 130 | /// Receive notification of character data. | 
|---|
| 131 | /// | 
|---|
| 132 | /// The Parser will call this method to report each chunk of character data. | 
|---|
| 133 | /// SAX parsers may return all contiguous character data in a single chunk, | 
|---|
| 134 | /// or they may split it into several chunks; however, all of the characters | 
|---|
| 135 | /// in any single event must come from the same external entity so that the | 
|---|
| 136 | /// Locator provides useful information. | 
|---|
| 137 | /// | 
|---|
| 138 | /// The application must not attempt to read from the array outside of the specified | 
|---|
| 139 | /// range. | 
|---|
| 140 | /// | 
|---|
| 141 | /// Individual characters may consist of more than one XMLChar value. There | 
|---|
| 142 | /// are three important cases where this happens, because characters can't be | 
|---|
| 143 | /// represented in just sixteen bits. In one case, characters are represented | 
|---|
| 144 | /// in a Surrogate Pair, using two special Unicode values. Such characters are | 
|---|
| 145 | /// in the so-called "Astral Planes", with a code point above U+FFFF. A second | 
|---|
| 146 | /// case involves composite characters, such as a base character combining with | 
|---|
| 147 | /// one or more accent characters. And most important, if XMLChar is a plain | 
|---|
| 148 | /// char, characters are encoded in UTF-8. | 
|---|
| 149 | /// | 
|---|
| 150 | /// Your code should not assume that algorithms using char-at-a-time idioms | 
|---|
| 151 | /// will be working in character units; in some cases they will split characters. | 
|---|
| 152 | /// This is relevant wherever XML permits arbitrary characters, such as attribute | 
|---|
| 153 | /// values, processing instruction data, and comments as well as in data reported | 
|---|
| 154 | /// from this method. It's also generally relevant whenever C++ code manipulates | 
|---|
| 155 | /// internationalized text; the issue isn't unique to XML. | 
|---|
| 156 | /// | 
|---|
| 157 | /// Note that some parsers will report whitespace in element content using the | 
|---|
| 158 | /// ignorableWhitespace method rather than this one (validating parsers must | 
|---|
| 159 | /// do so). | 
|---|
| 160 |  | 
|---|
| 161 | virtual void ignorableWhitespace(const XMLChar ch[], int start, int length) = 0; | 
|---|
| 162 | /// Receive notification of ignorable whitespace in element content. | 
|---|
| 163 | /// | 
|---|
| 164 | /// Validating Parsers must use this method to report each chunk of whitespace | 
|---|
| 165 | /// in element content (see the W3C XML 1.0 recommendation, section 2.10): non-validating | 
|---|
| 166 | /// parsers may also use this method if they are capable of parsing and using | 
|---|
| 167 | /// content models. | 
|---|
| 168 | /// | 
|---|
| 169 | /// SAX parsers may return all contiguous whitespace in a single chunk, or they | 
|---|
| 170 | /// may split it into several chunks; however, all of the characters in any | 
|---|
| 171 | /// single event must come from the same external entity, so that the Locator | 
|---|
| 172 | /// provides useful information. | 
|---|
| 173 | /// | 
|---|
| 174 | /// The application must not attempt to read from the array outside of the specified | 
|---|
| 175 | /// range. | 
|---|
| 176 |  | 
|---|
| 177 | virtual void processingInstruction(const XMLString& target, const XMLString& data) = 0; | 
|---|
| 178 | /// Receive notification of a processing instruction. | 
|---|
| 179 | /// | 
|---|
| 180 | /// The Parser will invoke this method once for each processing instruction | 
|---|
| 181 | /// found: note that processing instructions may occur before or after the main | 
|---|
| 182 | /// document element. | 
|---|
| 183 | /// | 
|---|
| 184 | /// A SAX parser must never report an XML declaration (XML 1.0, section 2.8) | 
|---|
| 185 | /// or a text declaration (XML 1.0, section 4.3.1) using this method. | 
|---|
| 186 | /// | 
|---|
| 187 | /// Like characters(), processing instruction data may have characters that | 
|---|
| 188 | /// need more than one char value. | 
|---|
| 189 |  | 
|---|
| 190 | virtual void startPrefixMapping(const XMLString& prefix, const XMLString& uri) = 0; | 
|---|
| 191 | /// Begin the scope of a prefix-URI Namespace mapping. | 
|---|
| 192 | /// | 
|---|
| 193 | /// The information from this event is not necessary for normal Namespace processing: | 
|---|
| 194 | /// the SAX XML reader will automatically replace prefixes for element and attribute | 
|---|
| 195 | /// names when the http://xml.org/sax/features/namespaces feature is true (the | 
|---|
| 196 | /// default). | 
|---|
| 197 | /// | 
|---|
| 198 | /// There are cases, however, when applications need to use prefixes in character | 
|---|
| 199 | /// data or in attribute values, where they cannot safely be expanded automatically; | 
|---|
| 200 | /// the start/endPrefixMapping event supplies the information to the application | 
|---|
| 201 | /// to expand prefixes in those contexts itself, if necessary. | 
|---|
| 202 | /// | 
|---|
| 203 | /// Note that start/endPrefixMapping events are not guaranteed to be properly | 
|---|
| 204 | /// nested relative to each other: all startPrefixMapping events will occur | 
|---|
| 205 | /// immediately before the corresponding startElement event, and all endPrefixMapping | 
|---|
| 206 | /// events will occur immediately after the corresponding endElement event, | 
|---|
| 207 | /// but their order is not otherwise guaranteed. | 
|---|
| 208 | /// | 
|---|
| 209 | /// There should never be start/endPrefixMapping events for the "xml" prefix, | 
|---|
| 210 | /// since it is predeclared and immutable. | 
|---|
| 211 |  | 
|---|
| 212 | virtual void endPrefixMapping(const XMLString& prefix) = 0; | 
|---|
| 213 | /// End the scope of a prefix-URI mapping. | 
|---|
| 214 | /// | 
|---|
| 215 | /// See startPrefixMapping for details. These events will always occur immediately | 
|---|
| 216 | /// after the corresponding endElement event, but the order of endPrefixMapping | 
|---|
| 217 | /// events is not otherwise guaranteed. | 
|---|
| 218 |  | 
|---|
| 219 | virtual void skippedEntity(const XMLString& name) = 0; | 
|---|
| 220 | /// Receive notification of a skipped entity. This is not called for entity | 
|---|
| 221 | /// references within markup constructs such as element start tags or markup | 
|---|
| 222 | /// declarations. (The XML recommendation requires reporting skipped external | 
|---|
| 223 | /// entities. SAX also reports internal entity expansion/non-expansion, except | 
|---|
| 224 | /// within markup constructs.) | 
|---|
| 225 | /// | 
|---|
| 226 | /// The Parser will invoke this method each time the entity is skipped. Non-validating | 
|---|
| 227 | /// processors may skip entities if they have not seen the declarations (because, | 
|---|
| 228 | /// for example, the entity was declared in an external DTD subset). All processors | 
|---|
| 229 | /// may skip external entities, depending on the values of the http://xml.org/sax/features/external-general-entities | 
|---|
| 230 | /// and the http://xml.org/sax/features/external-parameter-entities properties. | 
|---|
| 231 |  | 
|---|
| 232 | protected: | 
|---|
| 233 | virtual ~ContentHandler(); | 
|---|
| 234 | }; | 
|---|
| 235 |  | 
|---|
| 236 |  | 
|---|
| 237 | } } // namespace Poco::XML | 
|---|
| 238 |  | 
|---|
| 239 |  | 
|---|
| 240 | #endif // SAX_ContentHandler_INCLUDED | 
|---|
| 241 |  | 
|---|