xsmodel.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 881 行 · 第 1/3 页
CPP
881 行
{ XSNamespaceItem* namespaceItem = fParent->fXSNamespaceItemList->elementAt(i); fXSNamespaceItemList->addElement(namespaceItem); fNamespaceStringList->addElement ( XMLString::replicate ( namespaceItem->getSchemaNamespace(), manager ) ); } for (i=0; i<XSConstants::MULTIVALUE_FACET; i++) { switch (i+1) { case XSConstants::ATTRIBUTE_DECLARATION: case XSConstants::ELEMENT_DECLARATION: case XSConstants::TYPE_DEFINITION: case XSConstants::ATTRIBUTE_GROUP_DEFINITION: case XSConstants::MODEL_GROUP_DEFINITION: case XSConstants::NOTATION_DECLARATION: for (unsigned int j=0; j<fParent->fComponentMap[i]->getLength(); j++) { XSObject* copyObj = fParent->fComponentMap[i]->item(j); fComponentMap[i]->addElement(copyObj, copyObj->getName(), copyObj->getNamespace()); } break; } for (unsigned int j=0; j<fParent->fIdVector[i]->size(); j++) { fIdVector[i]->addElement(fParent->fIdVector[i]->elementAt(j)); } } for (i=0; i<fParent->fXSAnnotationList->size(); i++) { fXSAnnotationList->addElement(fParent->fXSAnnotationList->elementAt(i)); } } // end of copying parent info // Now add information from the new grammars but first create the // XSNamespaceItem's so we can have access to the XSAnnotations... ValueVectorOf<SchemaGrammar*>* grammarsToAdd = grammarResolver->getGrammarsToAddToXSModel(); unsigned int numberOfNamespaces = fXSNamespaceItemList->size(); unsigned int numberOfNamespacesToAdd = 0; for (i=0; i < grammarsToAdd->size(); i++) { SchemaGrammar* lGrammar = grammarsToAdd->elementAt(i); if (lGrammar->getGrammarType() != Grammar::SchemaGrammarType || XMLString::equals(lGrammar->getTargetNamespace(), SchemaSymbols::fgURI_SCHEMAFORSCHEMA)) continue; XMLCh* NameSpace = XMLString::replicate(lGrammar->getTargetNamespace(), manager); fNamespaceStringList->addElement(NameSpace); XSNamespaceItem* namespaceItem = new (manager) XSNamespaceItem(this, lGrammar, manager); fXSNamespaceItemList->addElement(namespaceItem); fHashNamespace->put(NameSpace, namespaceItem); fDeleteNamespace->addElement(namespaceItem); ++numberOfNamespacesToAdd; } // Add S4S namespace if needed if (!fAddedS4SGrammar) { DatatypeValidatorFactory dvFactory(manager); dvFactory.expandRegistryToFullSchemaSet(); XSNamespaceItem* namespaceItem = new (manager) XSNamespaceItem ( this, SchemaSymbols::fgURI_SCHEMAFORSCHEMA, manager ); fNamespaceStringList->addElement ( XMLString::replicate(SchemaSymbols::fgURI_SCHEMAFORSCHEMA,manager) ); fXSNamespaceItemList->addElement(namespaceItem); fHashNamespace->put ( (void*) SchemaSymbols::fgURI_SCHEMAFORSCHEMA , namespaceItem ); fDeleteNamespace->addElement(namespaceItem); addS4SToXSModel ( namespaceItem , dvFactory.getBuiltInRegistry() ); } // Now loop through all of the newly created NamespaceItem's for (i=numberOfNamespaces; i<(numberOfNamespaces+numberOfNamespacesToAdd); i++) { addGrammarToXSModel(fXSNamespaceItemList->elementAt(i)); } // end of namespaceItem loop}XSModel::~XSModel(){ for (unsigned int i=0; i<XSConstants::MULTIVALUE_FACET; i++) { switch (i+1) { case XSConstants::ATTRIBUTE_DECLARATION: case XSConstants::ELEMENT_DECLARATION: case XSConstants::TYPE_DEFINITION: case XSConstants::ATTRIBUTE_GROUP_DEFINITION: case XSConstants::MODEL_GROUP_DEFINITION: case XSConstants::NOTATION_DECLARATION: delete fComponentMap[i]; break; } delete fIdVector[i]; } delete fNamespaceStringList; delete fXSNamespaceItemList; delete fXSAnnotationList; delete fHashNamespace; delete fObjFactory; if (fDeleteNamespace) delete fDeleteNamespace; if (fDeleteParent && fParent && fParent->fDeleteParent) delete fParent;}// ---------------------------------------------------------------------------// XSModel: Helper methods// ---------------------------------------------------------------------------void XSModel::addComponentToIdVector(XSObject* const component, int componentIndex){ component->setId(fIdVector[componentIndex]->size()); fIdVector[componentIndex]->addElement(component);}void XSModel::addComponentToNamespace(XSNamespaceItem* const namespaceItem, XSObject* const component, int componentIndex, bool addToXSModel){ namespaceItem->fComponentMap[componentIndex]->addElement ( component, component->getName(), namespaceItem->getSchemaNamespace() ); namespaceItem->fHashMap[componentIndex]->put ( (void *) component->getName(), component ); if (addToXSModel) { fComponentMap[componentIndex]->addElement ( component, component->getName(), namespaceItem->getSchemaNamespace() ); }}voidXSModel::addS4SToXSModel(XSNamespaceItem* const namespaceItem, RefHashTableOf<DatatypeValidator>* const builtInDV){ addComponentToNamespace ( namespaceItem , fObjFactory->addOrFind ( ComplexTypeInfo::getAnyType ( fURIStringPool->getId(XMLUni::fgZeroLenString) ) , this ) , XSConstants::TYPE_DEFINITION - 1 ); // Loop through built-in simple types // First add 'anySimpleType' which is the base for the other built-ins DatatypeValidator* dv = builtInDV->get(SchemaSymbols::fgDT_ANYSIMPLETYPE); addComponentToNamespace ( namespaceItem , fObjFactory->addOrFind(dv, this, true) , XSConstants::TYPE_DEFINITION - 1 ); // add remaining built-in RefHashTableOfEnumerator<DatatypeValidator> simpleEnum = RefHashTableOfEnumerator<DatatypeValidator> (builtInDV, false, fMemoryManager); while (simpleEnum.hasMoreElements()) { DatatypeValidator& curSimple = simpleEnum.nextElement(); if (&curSimple == dv) continue; addComponentToNamespace ( namespaceItem , fObjFactory->addOrFind(&curSimple, this) , XSConstants::TYPE_DEFINITION - 1 ); } // Set flag to indicate that we have added S4S grammar info fAddedS4SGrammar = true;}void XSModel::addGrammarToXSModel(XSNamespaceItem* namespaceItem){ // Loop through top-level attribute declarations in the grammar... RefHashTableOf<XMLAttDef>* attDeclRegistry = namespaceItem->fGrammar->getAttributeDeclRegistry(); if(attDeclRegistry) { RefHashTableOfEnumerator<XMLAttDef> attrEnum = RefHashTableOfEnumerator<XMLAttDef> (attDeclRegistry, false, fMemoryManager); while (attrEnum.hasMoreElements()) { XSAttributeDeclaration* xsAttrDecl = fObjFactory->addOrFind ( (SchemaAttDef*) &(attrEnum.nextElement()), this ); addComponentToNamespace ( namespaceItem, xsAttrDecl, XSConstants::ATTRIBUTE_DECLARATION - 1 ); } // end of attribute loop } // Loop through top-level elements in the grammar... RefHash3KeysIdPoolEnumerator<SchemaElementDecl> elemEnum = namespaceItem->fGrammar->getElemEnumerator(); while (elemEnum.hasMoreElements()) { SchemaElementDecl& curElem = elemEnum.nextElement(); if (curElem.getEnclosingScope() == Grammar::TOP_LEVEL_SCOPE) { XSElementDeclaration* xsElemDecl = fObjFactory->addOrFind ( &curElem, this ); addComponentToNamespace ( namespaceItem, xsElemDecl, XSConstants::ELEMENT_DECLARATION -1 ); } } // end of element loop // Now loop through top-level User Defined simple type definitions in the grammar... DVHashTable* dvHT = namespaceItem->fGrammar->getDatatypeRegistry()->getUserDefinedRegistry(); if (dvHT) { RefHashTableOfEnumerator<DatatypeValidator> simpleUserEnum = RefHashTableOfEnumerator<DatatypeValidator> (dvHT, false, fMemoryManager); while (simpleUserEnum.hasMoreElements()) { DatatypeValidator& curSimple = simpleUserEnum.nextElement(); if (!curSimple.getAnonymous()) { addComponentToNamespace ( namespaceItem , fObjFactory->addOrFind(&curSimple, this) , XSConstants::TYPE_DEFINITION - 1 ); } } // end of simple User loop } // Loop through top-level COMPLEX type definitions in the grammar... RefHashTableOf<ComplexTypeInfo>* complexTypeRegistry = namespaceItem->fGrammar->getComplexTypeRegistry(); if(complexTypeRegistry) { RefHashTableOfEnumerator<ComplexTypeInfo> complexEnum = RefHashTableOfEnumerator<ComplexTypeInfo> (complexTypeRegistry, false, fMemoryManager); while (complexEnum.hasMoreElements()) { ComplexTypeInfo& curComplex = complexEnum.nextElement(); if (!curComplex.getAnonymous()) { addComponentToNamespace ( namespaceItem , fObjFactory->addOrFind(&curComplex, this) , XSConstants::TYPE_DEFINITION - 1 ); } } // end of type definition loop }
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?