schemainfo.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 311 行
CPP
311 行
/* * Copyright 2001,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. *//* * $Log: SchemaInfo.cpp,v $ * Revision 1.13 2004/09/29 20:58:10 knoaman * [Bug 1209] Problem with id usage across schema * http://issues.apache.org/jira/browse/XERCESC-1209 * * Revision 1.12 2004/09/08 13:56:56 peiyongz * Apache License Version 2.0 * * Revision 1.11 2003/12/11 19:26:27 knoaman * Store non schema attributes from parent in XSAnnotation * * Revision 1.10 2003/05/16 21:43:21 knoaman * Memory manager implementation: Modify constructors to pass in the memory manager. * * Revision 1.9 2002/11/04 14:49:41 tng * C++ Namespace Support. * * Revision 1.8 2002/09/24 20:12:48 tng * Performance: use XMLString::equals instead of XMLString::compareString * * Revision 1.7 2002/06/21 11:52:24 knoaman * cleanup * * Revision 1.6 2002/05/27 20:23:48 knoaman * Performance: lazily store top-level components to eliminate unnecessary traversal * of DOM tree when looking up for a top level component. * * Revision 1.5 2002/05/21 19:30:47 tng * DOM Reorganization: modify to use the new DOM interface. * * Revision 1.4 2002/03/19 21:22:39 knoaman * Fix for declarations referenced from a different NS in the case of a circular import. * * Revision 1.3 2002/03/19 15:57:12 knoaman * Fix for bug 7074. * * Revision 1.2 2002/02/06 22:24:59 knoaman * Use IDOM for schema processing. * * Revision 1.1.1.1 2002/02/01 22:22:46 peiyongz * sane_include * * Revision 1.6 2001/12/12 20:52:19 peiyongz * memory leak: fRedefineList * * Revision 1.5 2001/10/04 15:08:56 knoaman * Add support for circular import. * * Revision 1.4 2001/07/31 15:26:54 knoaman * Added support for <attributeGroup>. * * Revision 1.3 2001/07/09 14:29:43 knoaman * Fixes for import/include declarations * * Revision 1.2 2001/05/11 13:27:36 tng * Copyright update. * * Revision 1.1 2001/05/10 16:33:16 knoaman * Traverse Schema Part III + error messages. * */// ---------------------------------------------------------------------------// Includes// ---------------------------------------------------------------------------#include <xercesc/validators/schema/SchemaInfo.hpp>#include <xercesc/validators/schema/XUtil.hpp>#include <xercesc/validators/schema/SchemaSymbols.hpp>#include <xercesc/util/XMLString.hpp>#include <xercesc/internal/ValidationContextImpl.hpp>XERCES_CPP_NAMESPACE_BEGIN// ---------------------------------------------------------------------------// SchemaInfo: Constructors and Destructor// ---------------------------------------------------------------------------SchemaInfo::SchemaInfo(const unsigned short elemAttrDefaultQualified, const int blockDefault, const int finalDefault, const int targetNSURI, const int scopeCount, const unsigned int namespaceScopeLevel, XMLCh* const schemaURL, const XMLCh* const targetNSURIString, const DOMElement* const root, MemoryManager* const manager) : fAdoptInclude(false) , fProcessed(false) , fElemAttrDefaultQualified(elemAttrDefaultQualified) , fBlockDefault(blockDefault) , fFinalDefault(finalDefault) , fTargetNSURI(targetNSURI) , fScopeCount(scopeCount) , fNamespaceScopeLevel(namespaceScopeLevel) , fCurrentSchemaURL(schemaURL) , fTargetNSURIString(targetNSURIString) , fSchemaRootElement(root) , fIncludeInfoList(0) , fImportedInfoList(0) , fImportingInfoList(0) , fFailedRedefineList(0) , fImportedNSList(0) , fRecursingAnonTypes(0) , fRecursingTypeNames(0) , fNonXSAttList(0) , fValidationContext(0) , fMemoryManager(manager){ fImportingInfoList = new (fMemoryManager) RefVectorOf<SchemaInfo>(4, false, fMemoryManager); for (unsigned int i = 0; i < C_Count; i++) fTopLevelComponents[i] = 0; fNonXSAttList = new (fMemoryManager) ValueVectorOf<DOMNode*>(2, fMemoryManager); fValidationContext = new (fMemoryManager) ValidationContextImpl(fMemoryManager);}SchemaInfo::~SchemaInfo(){ fMemoryManager->deallocate(fCurrentSchemaURL);//delete [] fCurrentSchemaURL; delete fImportedInfoList; if (fAdoptInclude) delete fIncludeInfoList; delete fImportingInfoList; fImportedInfoList = fIncludeInfoList = fImportingInfoList = 0; delete fImportedNSList; fImportedNSList = 0; delete fFailedRedefineList; fFailedRedefineList = 0; delete fRecursingAnonTypes; fRecursingAnonTypes = 0; delete fRecursingTypeNames; fRecursingTypeNames = 0; for (unsigned int i = 0; i < C_Count; i++) { delete fTopLevelComponents[i]; fTopLevelComponents[i] = 0; } delete fNonXSAttList; fNonXSAttList = 0; delete fValidationContext; fValidationContext = 0;}// ---------------------------------------------------------------------------// SchemaInfo:// ---------------------------------------------------------------------------DOMElement*SchemaInfo::getTopLevelComponent(const unsigned short compCategory, const XMLCh* const compName, const XMLCh* const name, SchemaInfo** enclosingSchema) { SchemaInfo* currentInfo = this; DOMElement* child = getTopLevelComponent(compCategory, compName, name); if (child == 0) { unsigned int listSize = (fIncludeInfoList) ? fIncludeInfoList->size() : 0; for (unsigned int i=0; i < listSize; i++) { currentInfo = fIncludeInfoList->elementAt(i); if (currentInfo == this) continue; child = currentInfo->getTopLevelComponent(compCategory, compName, name); if (child != 0) { *enclosingSchema = currentInfo; break; } } } return child;}DOMElement*SchemaInfo::getTopLevelComponent(const unsigned short compCategory, const XMLCh* const compName, const XMLCh* const name) { if (compCategory >= C_Count) return 0; DOMElement* child = XUtil::getFirstChildElement(fSchemaRootElement); if (!child) return 0; ValueVectorOf<DOMElement*>* compList = fTopLevelComponents[compCategory]; if (fTopLevelComponents[compCategory] == 0) { compList= new (fMemoryManager) ValueVectorOf<DOMElement*>(16, fMemoryManager); fTopLevelComponents[compCategory] = compList; } else { unsigned int listLen = compList->size(); for (unsigned int i= 0; i < listLen; i++) { child = compList->elementAt(i); if (XMLString::equals(child->getAttribute(SchemaSymbols::fgATT_NAME), name)) return child; } } DOMElement* redefParent = (DOMElement*) child->getParentNode(); // Parent is not "redefine" if (!XMLString::equals(redefParent->getLocalName(),SchemaSymbols::fgELT_REDEFINE)) redefParent = 0; while (child != 0) { if (XMLString::equals(child->getLocalName(), compName)) { compList->addElement(child); if (XMLString::equals(child->getAttribute(SchemaSymbols::fgATT_NAME), name)) return child; } else if (XMLString::equals(child->getLocalName(),SchemaSymbols::fgELT_REDEFINE) && (!fFailedRedefineList || !fFailedRedefineList->containsElement(child))) { // if redefine DOMElement* redefineChild = XUtil::getFirstChildElement(child); while (redefineChild != 0) { if ((!fFailedRedefineList || !fFailedRedefineList->containsElement(redefineChild)) && XMLString::equals(redefineChild->getLocalName(), compName)) { compList->addElement(redefineChild); if (XMLString::equals(redefineChild->getAttribute(SchemaSymbols::fgATT_NAME), name)) return redefineChild; } redefineChild = XUtil::getNextSiblingElement(redefineChild); } } child = XUtil::getNextSiblingElement(child); if (child == 0 && redefParent) { child = XUtil::getNextSiblingElement(redefParent); redefParent = 0; } } return child;}void SchemaInfo::updateImportingInfo(SchemaInfo* const importingInfo) { if (!fImportingInfoList->containsElement(importingInfo)) { fImportingInfoList->addElement(importingInfo); } unsigned int listSize = importingInfo->fImportingInfoList->size(); for (unsigned int i=0; i < listSize; i++) { SchemaInfo* tmpInfo = importingInfo->fImportingInfoList->elementAt(i); if (tmpInfo != this && !fImportingInfoList->containsElement(tmpInfo)) { fImportingInfoList->addElement(tmpInfo); } }}XERCES_CPP_NAMESPACE_END/** * End of file SchemaInfo.cpp */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?