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 + -
显示快捷键?