abstractdomparser.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 1,615 行 · 第 1/4 页
CPP
1,615 行
/* * Copyright 2002,2004,2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. *//*** This file contains code to build the DOM tree. It registers a document* handler with the scanner. In these handler methods, appropriate DOM nodes* are created and added to the DOM tree.** $Id: AbstractDOMParser.cpp,v 1.68 2004/09/28 02:14:13 cargilld Exp $**/// ---------------------------------------------------------------------------// Includes// ---------------------------------------------------------------------------#include <xercesc/parsers/AbstractDOMParser.hpp>#include <xercesc/internal/XMLScannerResolver.hpp>#include <xercesc/internal/ElemStack.hpp>#include <xercesc/util/XMLUniDefs.hpp>#include <xercesc/framework/XMLNotationDecl.hpp>#include <xercesc/framework/XMLValidator.hpp>#include <xercesc/framework/psvi/PSVIElement.hpp>#include <xercesc/framework/psvi/PSVIAttribute.hpp>#include <xercesc/framework/psvi/PSVIAttributeList.hpp>#include <xercesc/framework/psvi/XSElementDeclaration.hpp>#include <xercesc/util/IOException.hpp>#include <xercesc/dom/DOMImplementation.hpp>#include <xercesc/dom/DOMImplementationRegistry.hpp>#include <xercesc/dom/DOMElement.hpp>#include <xercesc/dom/impl/DOMAttrImpl.hpp>#include <xercesc/dom/impl/DOMTypeInfoImpl.hpp>#include <xercesc/dom/DOMCDATASection.hpp>#include <xercesc/dom/DOMComment.hpp>#include <xercesc/dom/impl/DOMTextImpl.hpp>#include <xercesc/dom/impl/DOMDocumentImpl.hpp>#include <xercesc/dom/impl/DOMDocumentTypeImpl.hpp>#include <xercesc/dom/DOMDocumentType.hpp>#include <xercesc/dom/impl/DOMElementNSImpl.hpp>#include <xercesc/dom/impl/DOMEntityImpl.hpp>#include <xercesc/dom/impl/DOMEntityReferenceImpl.hpp>#include <xercesc/dom/impl/DOMNotationImpl.hpp>#include <xercesc/dom/DOMNamedNodeMap.hpp>#include <xercesc/dom/DOMProcessingInstruction.hpp>#include <xercesc/dom/impl/DOMProcessingInstructionImpl.hpp>#include <xercesc/dom/impl/DOMNodeIDMap.hpp>#include <xercesc/validators/common/ContentSpecNode.hpp>#include <xercesc/validators/common/GrammarResolver.hpp>#include <xercesc/validators/schema/SchemaSymbols.hpp>#include <xercesc/util/OutOfMemoryException.hpp>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------// AbstractDOMParser: Constructors and Destructor// ---------------------------------------------------------------------------AbstractDOMParser::AbstractDOMParser( XMLValidator* const valToAdopt , MemoryManager* const manager , XMLGrammarPool* const gramPool) : fCreateEntityReferenceNodes(true), fIncludeIgnorableWhitespace(true), fWithinElement(false), fParseInProgress(false), fCreateCommentNodes(true), fDocumentAdoptedByUser(false), fCreateSchemaInfo(false), fScanner(0), fImplementationFeatures(0), fCurrentParent(0), fCurrentNode(0), fCurrentEntity(0), fDocument(0), fNodeStack(0), fDocumentType(0), fDocumentVector(0), fGrammarResolver(0), fURIStringPool(0), fValidator(valToAdopt), fMemoryManager(manager), fGrammarPool(gramPool), fBufMgr(manager), fInternalSubset(fBufMgr.bidOnBuffer()), fPSVIHandler(0){ try { initialize(); } catch(const OutOfMemoryException&) { throw; } catch(...) { cleanUp(); throw; }}AbstractDOMParser::~AbstractDOMParser(){ cleanUp();}// ---------------------------------------------------------------------------// AbstractDOMParser: Initialize/CleanUp methods// ---------------------------------------------------------------------------void AbstractDOMParser::initialize(){ // Create grammar resolver and string pool to pass to the scanner fGrammarResolver = new (fMemoryManager) GrammarResolver(fGrammarPool, fMemoryManager); fURIStringPool = fGrammarResolver->getStringPool(); // Create a scanner and tell it what validator to use. Then set us // as the document event handler so we can fill the DOM document. fScanner = XMLScannerResolver::getDefaultScanner(fValidator, fGrammarResolver, fMemoryManager); fScanner->setDocHandler(this); fScanner->setDocTypeHandler(this); fScanner->setURIStringPool(fURIStringPool); fNodeStack = new (fMemoryManager) ValueStackOf<DOMNode*>(64, fMemoryManager); this->reset();}void AbstractDOMParser::cleanUp(){ if (fDocumentVector) delete fDocumentVector; if (!fDocumentAdoptedByUser && fDocument) fDocument->release(); delete fNodeStack; delete fScanner; delete fGrammarResolver; // grammar pool *always* owns this //delete fURIStringPool; fMemoryManager->deallocate(fImplementationFeatures); if (fValidator) delete fValidator;}// ---------------------------------------------------------------------------// AbstractDOMParser: Utilities// ---------------------------------------------------------------------------void AbstractDOMParser::reset(){ // if fDocument exists already, store the old pointer in the vector for deletion later if (fDocument && !fDocumentAdoptedByUser) { if (!fDocumentVector) { // allocate the vector if not exists yet fDocumentVector = new (fMemoryManager) RefVectorOf<DOMDocumentImpl>(10, true, fMemoryManager) ; } fDocumentVector->addElement(fDocument); } fDocument = 0; resetDocType(); fCurrentParent = 0; fCurrentNode = 0; fCurrentEntity = 0; fParseInProgress = false; fWithinElement = false; fDocumentAdoptedByUser = false; fNodeStack->removeAllElements(); fInternalSubset.reset();}void AbstractDOMParser::resetPool(){ // We cannot enter here while a regular parse is in progress. if (fParseInProgress) ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager); if (fDocumentVector) fDocumentVector->removeAllElements(); if (!fDocumentAdoptedByUser && fDocument) fDocument->release(); fDocument = 0;}bool AbstractDOMParser::isDocumentAdopted() const{ return fDocumentAdoptedByUser;}DOMDocument* AbstractDOMParser::adoptDocument(){ fDocumentAdoptedByUser = true; return fDocument;}// ---------------------------------------------------------------------------// AbstractDOMParser: Getter methods// ---------------------------------------------------------------------------DOMDocument* AbstractDOMParser::getDocument(){ return fDocument;}const XMLValidator& AbstractDOMParser::getValidator() const{ return *fScanner->getValidator();}bool AbstractDOMParser::getDoNamespaces() const{ return fScanner->getDoNamespaces();}bool AbstractDOMParser::getGenerateSyntheticAnnotations() const{ return fScanner->getGenerateSyntheticAnnotations();}bool AbstractDOMParser::getValidateAnnotations() const{ return fScanner->getValidateAnnotations();}bool AbstractDOMParser::getExitOnFirstFatalError() const{ return fScanner->getExitOnFirstFatal();}bool AbstractDOMParser::getValidationConstraintFatal() const{ return fScanner->getValidationConstraintFatal();}AbstractDOMParser::ValSchemes AbstractDOMParser::getValidationScheme() const{ const XMLScanner::ValSchemes scheme = fScanner->getValidationScheme(); if (scheme == XMLScanner::Val_Always) return Val_Always; else if (scheme == XMLScanner::Val_Never) return Val_Never; return Val_Auto;}bool AbstractDOMParser::getDoSchema() const{ return fScanner->getDoSchema();}bool AbstractDOMParser::getValidationSchemaFullChecking() const{ return fScanner->getValidationSchemaFullChecking();}bool AbstractDOMParser::getIdentityConstraintChecking() const{ return fScanner->getIdentityConstraintChecking();}int AbstractDOMParser::getErrorCount() const{ return fScanner->getErrorCount();}XMLCh* AbstractDOMParser::getExternalSchemaLocation() const{ return fScanner->getExternalSchemaLocation();}XMLCh* AbstractDOMParser::getExternalNoNamespaceSchemaLocation() const{ return fScanner->getExternalNoNamespaceSchemaLocation();}SecurityManager* AbstractDOMParser::getSecurityManager() const{ return fScanner->getSecurityManager();}bool AbstractDOMParser::getLoadExternalDTD() const{ return fScanner->getLoadExternalDTD();}bool AbstractDOMParser::getCalculateSrcOfs() const{ return fScanner->getCalculateSrcOfs();}bool AbstractDOMParser::getStandardUriConformant() const{ return fScanner->getStandardUriConformant();}// ---------------------------------------------------------------------------// AbstractDOMParser: Setter methods// ---------------------------------------------------------------------------void AbstractDOMParser::setPSVIHandler(PSVIHandler* const handler){ fPSVIHandler = handler; if (fPSVIHandler) { fScanner->setPSVIHandler(this); } else if(!fCreateSchemaInfo) { fScanner->setPSVIHandler(0); }}void AbstractDOMParser::setDoNamespaces(const bool newState){ fScanner->setDoNamespaces(newState);}void AbstractDOMParser::setGenerateSyntheticAnnotations(const bool newState){ fScanner->setGenerateSyntheticAnnotations(newState);}void AbstractDOMParser::setValidateAnnotations(const bool newState){ fScanner->setValidateAnnotations(newState);}void AbstractDOMParser::setExitOnFirstFatalError(const bool newState){ fScanner->setExitOnFirstFatal(newState);}void AbstractDOMParser::setValidationConstraintFatal(const bool newState){ fScanner->setValidationConstraintFatal(newState);}void AbstractDOMParser::setValidationScheme(const ValSchemes newScheme){ if (newScheme == Val_Never) fScanner->setValidationScheme(XMLScanner::Val_Never); else if (newScheme == Val_Always) fScanner->setValidationScheme(XMLScanner::Val_Always); else fScanner->setValidationScheme(XMLScanner::Val_Auto);}void AbstractDOMParser::setDoSchema(const bool newState){ fScanner->setDoSchema(newState);}void AbstractDOMParser::setValidationSchemaFullChecking(const bool schemaFullChecking){ fScanner->setValidationSchemaFullChecking(schemaFullChecking);}void AbstractDOMParser::setIdentityConstraintChecking(const bool identityConstraintChecking){ fScanner->setIdentityConstraintChecking(identityConstraintChecking);}void AbstractDOMParser::setExternalSchemaLocation(const XMLCh* const schemaLocation){ fScanner->setExternalSchemaLocation(schemaLocation);}void AbstractDOMParser::setExternalNoNamespaceSchemaLocation(const XMLCh* const noNamespaceSchemaLocation){ fScanner->setExternalNoNamespaceSchemaLocation(noNamespaceSchemaLocation);}void AbstractDOMParser::setExternalSchemaLocation(const char* const schemaLocation){ fScanner->setExternalSchemaLocation(schemaLocation);}void AbstractDOMParser::setExternalNoNamespaceSchemaLocation(const char* const noNamespaceSchemaLocation){ fScanner->setExternalNoNamespaceSchemaLocation(noNamespaceSchemaLocation);}void AbstractDOMParser::setSecurityManager(SecurityManager* const securityManager){ // since this could impact various components, don't permit it to change // during a parse if (fParseInProgress) ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?