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