| 1 | // | 
|---|
| 2 | // Document.h | 
|---|
| 3 | // | 
|---|
| 4 | // Library: XML | 
|---|
| 5 | // Package: DOM | 
|---|
| 6 | // Module:  DOM | 
|---|
| 7 | // | 
|---|
| 8 | // Definition of the DOM Document class. | 
|---|
| 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 DOM_Document_INCLUDED | 
|---|
| 18 | #define DOM_Document_INCLUDED | 
|---|
| 19 |  | 
|---|
| 20 |  | 
|---|
| 21 | #include "Poco/XML/XML.h" | 
|---|
| 22 | #include "Poco/DOM/AbstractContainerNode.h" | 
|---|
| 23 | #include "Poco/DOM/DocumentEvent.h" | 
|---|
| 24 | #include "Poco/DOM/Element.h" | 
|---|
| 25 | #include "Poco/XML/XMLString.h" | 
|---|
| 26 | #include "Poco/XML/NamePool.h" | 
|---|
| 27 | #include "Poco/AutoReleasePool.h" | 
|---|
| 28 |  | 
|---|
| 29 |  | 
|---|
| 30 | namespace Poco { | 
|---|
| 31 | namespace XML { | 
|---|
| 32 |  | 
|---|
| 33 |  | 
|---|
| 34 | class NamePool; | 
|---|
| 35 | class DocumentType; | 
|---|
| 36 | class DOMImplementation; | 
|---|
| 37 | class DocumentFragment; | 
|---|
| 38 | class Text; | 
|---|
| 39 | class ; | 
|---|
| 40 | class CDATASection; | 
|---|
| 41 | class ProcessingInstruction; | 
|---|
| 42 | class Attr; | 
|---|
| 43 | class EntityReference; | 
|---|
| 44 | class NodeList; | 
|---|
| 45 | class Entity; | 
|---|
| 46 | class Notation; | 
|---|
| 47 |  | 
|---|
| 48 |  | 
|---|
| 49 | class XML_API Document: public AbstractContainerNode, public DocumentEvent | 
|---|
| 50 | /// The Document interface represents the entire HTML or XML document. Conceptually, | 
|---|
| 51 | /// it is the root of the document tree, and provides the primary access to the | 
|---|
| 52 | /// document's data. | 
|---|
| 53 | /// | 
|---|
| 54 | /// Since elements, text nodes, comments, processing instructions, etc. cannot exist | 
|---|
| 55 | /// outside the context of a Document, the Document interface also contains the | 
|---|
| 56 | /// factory methods needed to create these objects. The Node objects created have a | 
|---|
| 57 | /// ownerDocument attribute which associates them with the Document within whose | 
|---|
| 58 | /// context they were created. | 
|---|
| 59 | { | 
|---|
| 60 | public: | 
|---|
| 61 | typedef Poco::AutoReleasePool<DOMObject> AutoReleasePool; | 
|---|
| 62 |  | 
|---|
| 63 | explicit Document(NamePool* pNamePool = 0); | 
|---|
| 64 | /// Creates a new document. If pNamePool == 0, the document | 
|---|
| 65 | /// creates its own name pool, otherwise it uses the given name pool. | 
|---|
| 66 | /// Sharing a name pool makes sense for documents containing instances | 
|---|
| 67 | /// of the same schema, thus reducing memory usage. | 
|---|
| 68 |  | 
|---|
| 69 | explicit Document(unsigned long namePoolSize); | 
|---|
| 70 | /// Creates a new document using a name pool with the given size, which | 
|---|
| 71 | /// should be a prime number (e.g., 251, 509, 1021, 4093). | 
|---|
| 72 |  | 
|---|
| 73 | Document(DocumentType* pDocumentType, NamePool* pNamePool = 0); | 
|---|
| 74 | /// Creates a new document. If pNamePool == 0, the document | 
|---|
| 75 | /// creates its own name pool, otherwise it uses the given name pool. | 
|---|
| 76 | /// Sharing a name pool makes sense for documents containing instances | 
|---|
| 77 | /// of the same schema, thus reducing memory usage. | 
|---|
| 78 |  | 
|---|
| 79 | Document(DocumentType* pDocumentType, unsigned long namePoolSize); | 
|---|
| 80 | /// Creates a new document using a name pool with the given size, which | 
|---|
| 81 | /// should be a prime number (e.g., 251, 509, 1021, 4093). | 
|---|
| 82 |  | 
|---|
| 83 | NamePool& namePool(); | 
|---|
| 84 | /// Returns a pointer to the documents Name Pool. | 
|---|
| 85 |  | 
|---|
| 86 | AutoReleasePool& autoReleasePool(); | 
|---|
| 87 | /// Returns a pointer to the documents Auto Release Pool. | 
|---|
| 88 |  | 
|---|
| 89 | void collectGarbage(); | 
|---|
| 90 | /// Releases all objects in the Auto Release Pool. | 
|---|
| 91 |  | 
|---|
| 92 | void suspendEvents(); | 
|---|
| 93 | /// Suspends all events until resumeEvents() is called. | 
|---|
| 94 |  | 
|---|
| 95 | void resumeEvents(); | 
|---|
| 96 | /// Resumes all events suspended with suspendEvent(); | 
|---|
| 97 |  | 
|---|
| 98 | bool eventsSuspended() const; | 
|---|
| 99 | /// Returns true if events are suspended. | 
|---|
| 100 |  | 
|---|
| 101 | bool events() const; | 
|---|
| 102 | /// Returns true if events are not suspended. | 
|---|
| 103 |  | 
|---|
| 104 | const DocumentType* doctype() const; | 
|---|
| 105 | /// The Document Type Declaration (see DocumentType) associated with this document. | 
|---|
| 106 | /// For HTML documents as well as XML documents without a document type declaration | 
|---|
| 107 | /// this returns null. The DOM Level 1 does not support editing the Document | 
|---|
| 108 | /// Type Declaration. docType cannot be altered in any way, including through | 
|---|
| 109 | /// the use of methods inherited from the Node interface, such as insertNode | 
|---|
| 110 | /// or removeNode. | 
|---|
| 111 |  | 
|---|
| 112 | const DOMImplementation& implementation() const; | 
|---|
| 113 | /// The DOMImplementation object that handles this document. A DOM application | 
|---|
| 114 | /// may use objects from multiple implementations. | 
|---|
| 115 |  | 
|---|
| 116 | Element* documentElement() const; | 
|---|
| 117 | /// This is a convenience attribute that allows direct access to the child node | 
|---|
| 118 | /// that is the root element of the document. For HTML documents, this is the | 
|---|
| 119 | /// element with the tagName "HTML". | 
|---|
| 120 |  | 
|---|
| 121 | Element* createElement(const XMLString& tagName) const; | 
|---|
| 122 | /// Creates an element of the type specified. Note that the instance returned | 
|---|
| 123 | /// implements the Element interface, so attributes can be specified directly | 
|---|
| 124 | /// on the returned object. | 
|---|
| 125 | /// | 
|---|
| 126 | /// In addition, if there are known attributes with default values, Attr nodes | 
|---|
| 127 | /// representing them are automatically created and attached to the element. | 
|---|
| 128 |  | 
|---|
| 129 | DocumentFragment* createDocumentFragment() const; | 
|---|
| 130 | /// Creates an empty DocumentFragment object. | 
|---|
| 131 |  | 
|---|
| 132 | Text* createTextNode(const XMLString& data) const; | 
|---|
| 133 | /// Creates a text node given the specified string. | 
|---|
| 134 |  | 
|---|
| 135 | Comment* (const XMLString& data) const; | 
|---|
| 136 | /// Creates a comment node given the specified string. | 
|---|
| 137 |  | 
|---|
| 138 | CDATASection* createCDATASection(const XMLString& data) const; | 
|---|
| 139 | /// Creates a CDATASection node whose value is the specified string. | 
|---|
| 140 |  | 
|---|
| 141 | ProcessingInstruction* createProcessingInstruction(const XMLString& target, const XMLString& data) const; | 
|---|
| 142 | /// Creates a ProcessingInstruction node given the specified target and data strings. | 
|---|
| 143 |  | 
|---|
| 144 | Attr* createAttribute(const XMLString& name) const; | 
|---|
| 145 | /// Creates an Attr of the given name. Note that the Attr instance can then | 
|---|
| 146 | /// be set on an Element using the setAttributeNode method. | 
|---|
| 147 |  | 
|---|
| 148 | EntityReference* createEntityReference(const XMLString& name) const; | 
|---|
| 149 | /// Creates an EntityReference object. In addition, if the referenced entity | 
|---|
| 150 | /// is known, the child list of the EntityReference node is made the same as | 
|---|
| 151 | /// that of the corresponding Entity node. | 
|---|
| 152 |  | 
|---|
| 153 | NodeList* getElementsByTagName(const XMLString& name) const; | 
|---|
| 154 | /// Returns a NodeList of all Elements with a given tag name in the order | 
|---|
| 155 | /// in which they would be encountered in a preorder traversal of the | 
|---|
| 156 | /// document tree. | 
|---|
| 157 | /// | 
|---|
| 158 | /// The returned NodeList must be released with a call to release() | 
|---|
| 159 | /// when no longer needed. | 
|---|
| 160 |  | 
|---|
| 161 | // DOM Level 2 | 
|---|
| 162 | Node* importNode(Node* importedNode, bool deep); | 
|---|
| 163 | /// Imports a node from another document to this document. The returned node | 
|---|
| 164 | /// has no parent; (parentNode is null). The source node is not altered or removed | 
|---|
| 165 | /// from the original document; this method creates a new copy of the source | 
|---|
| 166 | /// node. | 
|---|
| 167 | /// For all nodes, importing a node creates a node object owned by the importing | 
|---|
| 168 | /// document, with attribute values identical to the source node's nodeName | 
|---|
| 169 | /// and nodeType, plus the attributes related to namespaces (prefix, localName, | 
|---|
| 170 | /// and namespaceURI). As in the cloneNode operation on a Node, the source node | 
|---|
| 171 | /// is not altered. | 
|---|
| 172 | /// Additional information is copied as appropriate to the nodeType, attempting | 
|---|
| 173 | /// to mirror the behavior expected if a fragment of XML or HTML source was | 
|---|
| 174 | /// copied from one document to another, recognizing that the two documents | 
|---|
| 175 | /// may have different DTDs in the XML case. | 
|---|
| 176 |  | 
|---|
| 177 | Element* createElementNS(const XMLString& namespaceURI, const XMLString& qualifiedName) const; | 
|---|
| 178 | /// Creates an element of the given qualified name and namespace URI. | 
|---|
| 179 |  | 
|---|
| 180 | Attr* createAttributeNS(const XMLString& namespaceURI, const XMLString& qualifiedName) const; | 
|---|
| 181 | /// Creates an attribute of the given qualified name and namespace URI. | 
|---|
| 182 |  | 
|---|
| 183 | NodeList* getElementsByTagNameNS(const XMLString& namespaceURI, const XMLString& localName) const; | 
|---|
| 184 | /// Returns a NodeList of all the Elements with a given local name and | 
|---|
| 185 | /// namespace URI in the order in which they are encountered in a | 
|---|
| 186 | /// preorder traversal of the Document tree. | 
|---|
| 187 |  | 
|---|
| 188 | Element* getElementById(const XMLString& elementId) const; | 
|---|
| 189 | /// Returns the Element whose ID is given by elementId. If no such | 
|---|
| 190 | /// element exists, returns null. Behavior is not defined if more | 
|---|
| 191 | /// than one element has this ID. | 
|---|
| 192 | /// | 
|---|
| 193 | /// Note: The DOM implementation must have information that says | 
|---|
| 194 | /// which attributes are of type ID. Attributes with the name "ID" | 
|---|
| 195 | /// are not of type ID unless so defined. Implementations that do | 
|---|
| 196 | /// not know whether attributes are of type ID or not are expected to | 
|---|
| 197 | /// return null. This implementation therefore returns null. | 
|---|
| 198 | /// | 
|---|
| 199 | /// See also the non-standard two argument variant of getElementById() | 
|---|
| 200 | /// and getElementByIdNS(). | 
|---|
| 201 |  | 
|---|
| 202 | // DocumentEvent | 
|---|
| 203 | Event* createEvent(const XMLString& eventType) const; | 
|---|
| 204 |  | 
|---|
| 205 | // Node | 
|---|
| 206 | const XMLString& nodeName() const; | 
|---|
| 207 | unsigned short nodeType() const; | 
|---|
| 208 |  | 
|---|
| 209 | // EventTarget | 
|---|
| 210 | bool dispatchEvent(Event* evt); | 
|---|
| 211 |  | 
|---|
| 212 | // Extensions | 
|---|
| 213 | Entity* createEntity(const XMLString& name, const XMLString& publicId, const XMLString& systemId, const XMLString& notationName) const; | 
|---|
| 214 | /// Creates an Entity with the given name, publicId, systemId and notationName. | 
|---|
| 215 | /// | 
|---|
| 216 | /// This method is not part of the W3C Document Object Model. | 
|---|
| 217 |  | 
|---|
| 218 | Notation* createNotation(const XMLString& name, const XMLString& publicId, const XMLString& systemId) const; | 
|---|
| 219 | /// Creates a Notation with the given name, publicId and systemId. | 
|---|
| 220 | /// | 
|---|
| 221 | /// This method is not part of the W3C Document Object Model. | 
|---|
| 222 |  | 
|---|
| 223 | Element* getElementById(const XMLString& elementId, const XMLString& idAttribute) const; | 
|---|
| 224 | /// Returns the first Element whose ID attribute (given in idAttribute) | 
|---|
| 225 | /// has the given elementId. If no such element exists, returns null. | 
|---|
| 226 | /// | 
|---|
| 227 | /// This method is an extension to the W3C Document Object Model. | 
|---|
| 228 |  | 
|---|
| 229 | Element* getElementByIdNS(const XMLString& elementId, const XMLString& idAttributeURI, const XMLString& idAttributeLocalName) const; | 
|---|
| 230 | /// Returns the first Element whose ID attribute (given in idAttributeURI and idAttributeLocalName) | 
|---|
| 231 | /// has the given elementId. If no such element exists, returns null. | 
|---|
| 232 | /// | 
|---|
| 233 | /// This method is an extension to the W3C Document Object Model. | 
|---|
| 234 |  | 
|---|
| 235 | protected: | 
|---|
| 236 | ~Document(); | 
|---|
| 237 |  | 
|---|
| 238 | Node* copyNode(bool deep, Document* pOwnerDocument) const; | 
|---|
| 239 |  | 
|---|
| 240 | DocumentType* getDoctype(); | 
|---|
| 241 | void setDoctype(DocumentType* pDoctype); | 
|---|
| 242 |  | 
|---|
| 243 | private: | 
|---|
| 244 | DocumentType*   _pDocumentType; | 
|---|
| 245 | NamePool*       _pNamePool; | 
|---|
| 246 | AutoReleasePool _autoReleasePool; | 
|---|
| 247 | int             _eventSuspendLevel; | 
|---|
| 248 |  | 
|---|
| 249 | static const XMLString NODE_NAME; | 
|---|
| 250 |  | 
|---|
| 251 | friend class DOMBuilder; | 
|---|
| 252 | }; | 
|---|
| 253 |  | 
|---|
| 254 |  | 
|---|
| 255 | // | 
|---|
| 256 | // inlines | 
|---|
| 257 | // | 
|---|
| 258 | inline NamePool& Document::namePool() | 
|---|
| 259 | { | 
|---|
| 260 | return *_pNamePool; | 
|---|
| 261 | } | 
|---|
| 262 |  | 
|---|
| 263 |  | 
|---|
| 264 | inline Document::AutoReleasePool& Document::autoReleasePool() | 
|---|
| 265 | { | 
|---|
| 266 | return _autoReleasePool; | 
|---|
| 267 | } | 
|---|
| 268 |  | 
|---|
| 269 |  | 
|---|
| 270 | inline const DocumentType* Document::doctype() const | 
|---|
| 271 | { | 
|---|
| 272 | return _pDocumentType; | 
|---|
| 273 | } | 
|---|
| 274 |  | 
|---|
| 275 |  | 
|---|
| 276 | inline DocumentType* Document::getDoctype() | 
|---|
| 277 | { | 
|---|
| 278 | return _pDocumentType; | 
|---|
| 279 | } | 
|---|
| 280 |  | 
|---|
| 281 |  | 
|---|
| 282 | } } // namespace Poco::XML | 
|---|
| 283 |  | 
|---|
| 284 |  | 
|---|
| 285 | #endif // DOM_Document_INCLUDED | 
|---|
| 286 |  | 
|---|