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