dombuilderimpl.cpp

来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 725 行 · 第 1/2 页

CPP
725
字号
/* * Copyright 2002, 2003,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: DOMBuilderImpl.cpp,v 1.41 2004/09/28 04:40:08 cargilld Exp $**/// ---------------------------------------------------------------------------//  Includes// ---------------------------------------------------------------------------#include <xercesc/parsers/DOMBuilderImpl.hpp>#include <xercesc/util/IOException.hpp>#include <xercesc/dom/DOMEntityResolver.hpp>#include <xercesc/dom/DOMErrorHandler.hpp>#include <xercesc/dom/impl/DOMErrorImpl.hpp>#include <xercesc/dom/impl/DOMLocatorImpl.hpp>#include <xercesc/dom/DOMException.hpp>#include <xercesc/sax/SAXParseException.hpp>#include <xercesc/internal/XMLScanner.hpp>#include <xercesc/framework/Wrapper4DOMInputSource.hpp>#include <xercesc/framework/XMLGrammarPool.hpp>#include <xercesc/framework/XMLSchemaDescription.hpp>#include <xercesc/util/Janitor.hpp>#include <xercesc/validators/common/GrammarResolver.hpp>#include <xercesc/util/OutOfMemoryException.hpp>#include <xercesc/util/XMLEntityResolver.hpp>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------//  DOMBuilderImpl: Constructors and Destructor// ---------------------------------------------------------------------------DOMBuilderImpl::DOMBuilderImpl( XMLValidator* const   valToAdopt                              , MemoryManager* const  manager                              , XMLGrammarPool* const gramPool) :AbstractDOMParser(valToAdopt, manager, gramPool), fAutoValidation(false), fValidation(false), fEntityResolver(0), fXMLEntityResolver(0), fErrorHandler(0), fFilter(0), fCharsetOverridesXMLEncoding(true), fUserAdoptsDocument(false){    // dom spec has different default from scanner's default, so set explicitly    getScanner()->setNormalizeData(false);}DOMBuilderImpl::~DOMBuilderImpl(){}// ---------------------------------------------------------------------------//  DOMBuilderImpl: Setter methods// ---------------------------------------------------------------------------void DOMBuilderImpl::setErrorHandler(DOMErrorHandler* const handler){    fErrorHandler = handler;    if (fErrorHandler) {        getScanner()->setErrorReporter(this);    }    else {        getScanner()->setErrorReporter(0);    }}void DOMBuilderImpl::setEntityResolver(DOMEntityResolver* const handler){    fEntityResolver = handler;    if (fEntityResolver) {        getScanner()->setEntityHandler(this);        fXMLEntityResolver = 0;    }    else {        getScanner()->setEntityHandler(0);    }}void DOMBuilderImpl::setXMLEntityResolver(XMLEntityResolver* const handler){    fXMLEntityResolver = handler;    if (fXMLEntityResolver) {        getScanner()->setEntityHandler(this);        fEntityResolver = 0;    }    else {        getScanner()->setEntityHandler(0);    }}void DOMBuilderImpl::setFilter(DOMBuilderFilter* const){    throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager());}// ---------------------------------------------------------------------------//  DOMBuilderImpl: Feature methods// ---------------------------------------------------------------------------void DOMBuilderImpl::setFeature(const XMLCh* const name, const bool state){    if (XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) {        setCreateEntityReferenceNodes(state);    }    else if (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) {        setCreateCommentNodes(state);    }    else if (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) {        getScanner()->setNormalizeData(state);    }    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) {        setDoNamespaces(state);    }    else if (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {        setIncludeIgnorableWhitespace(state);    }    else if (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) {        fValidation = state;        if (state) {            if (getValidationScheme() == AbstractDOMParser::Val_Never)                setValidationScheme(AbstractDOMParser::Val_Always);        }        else {            setValidationScheme(AbstractDOMParser::Val_Never);        }    }    else if (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) {        fAutoValidation = state;        if (state) {            setValidationScheme(AbstractDOMParser::Val_Auto);        }        else {            setValidationScheme(AbstractDOMParser::Val_Never);        }    }    else if (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) {        // in fact, setting this has no effect to the parser        fCharsetOverridesXMLEncoding = state;    }    else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||             XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||             XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {        if (state)            throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager());    }    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||             XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {        if (!state)            throw DOMException(DOMException::NOT_SUPPORTED_ERR, 0, getMemoryManager());    }    else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)    {        setDoSchema(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0)    {        setValidationSchemaFullChecking(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0)    {        if(state)            fUserAdoptsDocument = true;        else            fUserAdoptsDocument = false;    }    else if (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0)    {        setLoadExternalDTD(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0)    {        setExitOnFirstFatalError(!state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)    {        setValidationConstraintFatal(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesCacheGrammarFromParse) == 0)    {        getScanner()->cacheGrammarFromParse(state);        if (state)            getScanner()->useCachedGrammarInParse(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)    {        if (state || !getScanner()->isCachingGrammarFromParse())            getScanner()->useCachedGrammarInParse(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)    {        getScanner()->setCalculateSrcOfs(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesStandardUriConformant) == 0)    {        getScanner()->setStandardUriConformant(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesDOMHasPSVIInfo) == 0)    {        setCreateSchemaInfo(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesGenerateSyntheticAnnotations) == 0)    {        getScanner()->setGenerateSyntheticAnnotations(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesValidateAnnotations) == 0)    {        getScanner()->setValidateAnnotations(state);    }    else if (XMLString::compareIString(name, XMLUni::fgXercesIdentityConstraintChecking) == 0)    {        getScanner()->setIdentityConstraintChecking(state);    }    else {        throw DOMException(DOMException::NOT_FOUND_ERR, 0, getMemoryManager());    }}bool DOMBuilderImpl::getFeature(const XMLCh* const name) const{    if (XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) {        return getCreateEntityReferenceNodes();    }    else if (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) {        return getCreateCommentNodes();    }    else if (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) {        return getScanner()->getNormalizeData();    }    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) {        return getDoNamespaces();    }    else if (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) {        return getIncludeIgnorableWhitespace();    }    else if (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) {        return fValidation;    }    else if (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) {        return fAutoValidation;    }    else if (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) {        return fCharsetOverridesXMLEncoding;    }    else if (XMLString::compareIString(name, XMLUni::fgDOMSupportedMediatypesOnly) == 0 ||             XMLString::compareIString(name, XMLUni::fgDOMInfoset) == 0 ||             XMLString::compareIString(name, XMLUni::fgDOMCanonicalForm) == 0 ) {        return false;    }    else if (XMLString::compareIString(name, XMLUni::fgDOMNamespaceDeclarations) == 0 ||             XMLString::compareIString(name, XMLUni::fgDOMCDATASections) == 0 ) {        return true;    }    else if (XMLString::compareIString(name, XMLUni::fgXercesSchema) == 0)    {        return getDoSchema();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesSchemaFullChecking) == 0)    {        return getValidationSchemaFullChecking();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesIdentityConstraintChecking) == 0)    {        return getIdentityConstraintChecking();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesLoadExternalDTD) == 0)    {        return getLoadExternalDTD();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesContinueAfterFatalError) == 0)    {        return !getExitOnFirstFatalError();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesValidationErrorAsFatal) == 0)    {        return getValidationConstraintFatal();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesCacheGrammarFromParse) == 0)    {        return getScanner()->isCachingGrammarFromParse();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesUseCachedGrammarInParse) == 0)    {        return getScanner()->isUsingCachedGrammarInParse();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0)    {        return getScanner()->getCalculateSrcOfs();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesStandardUriConformant) == 0)    {        return getScanner()->getStandardUriConformant();    }    else if(XMLString::compareIString(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0) {        return fUserAdoptsDocument;    }    else if (XMLString::compareIString(name, XMLUni::fgXercesDOMHasPSVIInfo) == 0) {        return getCreateSchemaInfo();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesGenerateSyntheticAnnotations) == 0)    {        return getScanner()->getGenerateSyntheticAnnotations();    }    else if (XMLString::compareIString(name, XMLUni::fgXercesValidateAnnotations) == 0)    {        return getScanner()->getValidateAnnotations();    }    else {        throw DOMException(DOMException::NOT_FOUND_ERR, 0, getMemoryManager());    }    return false;}bool DOMBuilderImpl::canSetFeature(const XMLCh* const name, const bool state) const{    if ((XMLString::compareIString(name, XMLUni::fgDOMEntities) == 0) ||        (XMLString::compareIString(name, XMLUni::fgDOMComments) == 0) ||        (XMLString::compareIString(name, XMLUni::fgDOMDatatypeNormalization) == 0) ||        (XMLString::compareIString(name, XMLUni::fgDOMNamespaces) == 0) ||        (XMLString::compareIString(name, XMLUni::fgDOMValidation) == 0) ||        (XMLString::compareIString(name, XMLUni::fgDOMValidateIfSchema) == 0) ||        (XMLString::compareIString(name, XMLUni::fgDOMCharsetOverridesXMLEncoding) == 0) ||        (XMLString::compareIString(name, XMLUni::fgDOMWhitespaceInElementContent) == 0) ||        (XMLString::compareIString(name, XMLUni::fgXercesUserAdoptsDOMDocument) == 0) ||        (XMLString::compareIString(name, XMLUni::fgXercesCalculateSrcOfs) == 0) ||

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?