abstractdomparser.cpp

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

CPP
1,615
字号
    fScanner->setSecurityManager(securityManager);}void AbstractDOMParser::setLoadExternalDTD(const bool newState){    fScanner->setLoadExternalDTD(newState);}void AbstractDOMParser::setCalculateSrcOfs(const bool newState){    fScanner->setCalculateSrcOfs(newState);}void AbstractDOMParser::setStandardUriConformant(const bool newState){    fScanner->setStandardUriConformant(newState);}void AbstractDOMParser::useScanner(const XMLCh* const scannerName){    XMLScanner* tempScanner = XMLScannerResolver::resolveScanner    (        scannerName        , fValidator        , fGrammarResolver        , fMemoryManager    );    if (tempScanner) {        tempScanner->setParseSettings(fScanner);        tempScanner->setURIStringPool(fURIStringPool);        delete fScanner;        fScanner = tempScanner;    }}void AbstractDOMParser::setCreateSchemaInfo(const bool create){    fCreateSchemaInfo = create;    if(fCreateSchemaInfo)        fScanner->setPSVIHandler(this);    else if(!fPSVIHandler)        fScanner->setPSVIHandler(0);}// ---------------------------------------------------------------------------//  AbstractDOMParser: Parsing methods// ---------------------------------------------------------------------------void AbstractDOMParser::parse(const InputSource& source){    // Avoid multiple entrance    if (fParseInProgress)        ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager);    try    {        fParseInProgress = true;        fScanner->scanDocument(source);        fParseInProgress = false;    }    catch(const OutOfMemoryException&)    {        throw;    }        catch(...)    {        fParseInProgress = false;        throw;    }}void AbstractDOMParser::parse(const XMLCh* const systemId){    // Avoid multiple entrance    if (fParseInProgress)        ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager);    try    {        fParseInProgress = true;        fScanner->scanDocument(systemId);        fParseInProgress = false;    }    catch(const OutOfMemoryException&)    {        throw;    }    catch(...)    {        fParseInProgress = false;        throw;    }}void AbstractDOMParser::parse(const char* const systemId){    // Avoid multiple entrance    if (fParseInProgress)        ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager);    try    {        fParseInProgress = true;        fScanner->scanDocument(systemId);        fParseInProgress = false;    }    catch(const OutOfMemoryException&)    {        throw;    }    catch(...)    {        fParseInProgress = false;        throw;    }}// ---------------------------------------------------------------------------//  AbstractDOMParser: Progressive parse methods// ---------------------------------------------------------------------------bool AbstractDOMParser::parseFirst( const XMLCh* const    systemId                                   ,       XMLPScanToken&  toFill){    //    //  Avoid multiple entrance. We cannot enter here while a regular parse    //  is in progress.    //    if (fParseInProgress)        ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager);    return fScanner->scanFirst(systemId, toFill);}bool AbstractDOMParser::parseFirst( const char* const         systemId                                   ,       XMLPScanToken&      toFill){    //    //  Avoid multiple entrance. We cannot enter here while a regular parse    //  is in progress.    //    if (fParseInProgress)        ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager);    return fScanner->scanFirst(systemId, toFill);}bool AbstractDOMParser::parseFirst( const InputSource& source                                   ,       XMLPScanToken&  toFill){    //    //  Avoid multiple entrance. We cannot enter here while a regular parse    //  is in progress.    //    if (fParseInProgress)        ThrowXMLwithMemMgr(IOException, XMLExcepts::Gen_ParseInProgress, fMemoryManager);    return fScanner->scanFirst(source, toFill);}bool AbstractDOMParser::parseNext(XMLPScanToken& token){    return fScanner->scanNext(token);}void AbstractDOMParser::parseReset(XMLPScanToken& token){    // Reset the scanner, and then reset the parser    fScanner->scanReset(token);    reset();}// ---------------------------------------------------------------------------//  AbstractDOMParser: Implementation of PSVIHandler interface// ---------------------------------------------------------------------------void AbstractDOMParser::handleElementPSVI(const XMLCh* const            localName                                         , const XMLCh* const            uri                                        ,       PSVIElement *           elementInfo){    // associate the info now; if the user wants, she can override what we did    if(fCreateSchemaInfo)    {        DOMTypeInfoImpl* typeInfo=new (getDocument()) DOMTypeInfoImpl();        typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Validity, elementInfo->getValidity());        typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Validitation_Attempted, elementInfo->getValidationAttempted());        if(elementInfo->getTypeDefinition())        {            typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type, elementInfo->getTypeDefinition()->getTypeCategory());            typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous, elementInfo->getTypeDefinition()->getAnonymous());            typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace,                 fDocument->getPooledString(elementInfo->getTypeDefinition()->getNamespace()));            typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name,                 fDocument->getPooledString(elementInfo->getTypeDefinition()->getName()));        }        else if(elementInfo->getValidity()==PSVIItem::VALIDITY_VALID)        {            // if we are valid but we don't have a type validator, we are xs:anyType            typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type, XSTypeDefinition::COMPLEX_TYPE);            typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous, false);            typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);            typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name, SchemaSymbols::fgATTVAL_ANYTYPE);        }        if(elementInfo->getMemberTypeDefinition())        {            typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Anonymous, elementInfo->getMemberTypeDefinition()->getAnonymous());            typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Namespace,                 fDocument->getPooledString(elementInfo->getMemberTypeDefinition()->getNamespace()));            typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Name,                 fDocument->getPooledString(elementInfo->getMemberTypeDefinition()->getName()));        }        if(elementInfo->getElementDeclaration())            typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Nil, elementInfo->getElementDeclaration()->getNillable());        typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Default, fDocument->getPooledString(elementInfo->getSchemaDefault()));        typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Normalized_Value, fDocument->getPooledString(elementInfo->getSchemaNormalizedValue()));        typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified, true);        ((DOMElementNSImpl*)fCurrentParent)->setTypeInfo(typeInfo);    }    if(fPSVIHandler)        fPSVIHandler->handleElementPSVI(localName, uri, elementInfo);}void AbstractDOMParser::handlePartialElementPSVI(const XMLCh* const            localName                                                , const XMLCh* const            uri                                               ,       PSVIElement *           elementInfo){    if(fPSVIHandler)        fPSVIHandler->handlePartialElementPSVI(localName, uri, elementInfo);}void AbstractDOMParser::handleAttributesPSVI( const XMLCh* const            localName                                             , const XMLCh* const            uri                                            ,       PSVIAttributeList *     psviAttributes){    if(fCreateSchemaInfo)    {        for (unsigned int index=0; index < psviAttributes->getLength(); index++) {            XERCES_CPP_NAMESPACE_QUALIFIER PSVIAttribute *attrInfo=psviAttributes->getAttributePSVIAtIndex(index);            XERCES_CPP_NAMESPACE_QUALIFIER DOMNode* pAttrNode=fCurrentNode->getAttributes()->getNamedItemNS(psviAttributes->getAttributeNamespaceAtIndex(index),                                                                                                            psviAttributes->getAttributeNameAtIndex(index));            if(pAttrNode!=NULL)            {                DOMTypeInfoImpl* typeInfo=new (getDocument()) DOMTypeInfoImpl();                typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Validity, attrInfo->getValidity());                typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Validitation_Attempted, attrInfo->getValidationAttempted());                if(attrInfo->getTypeDefinition())                {                    typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type, XSTypeDefinition::SIMPLE_TYPE);                    typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous, attrInfo->getTypeDefinition()->getAnonymous());                    typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace,                         fDocument->getPooledString(attrInfo->getTypeDefinition()->getNamespace()));                    typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name,                         fDocument->getPooledString(attrInfo->getTypeDefinition()->getName()));                }                else if(attrInfo->getValidity()==PSVIItem::VALIDITY_VALID)                {                    // if we are valid but we don't have a type validator, we are xs:anySimpleType                    typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Type, XSTypeDefinition::SIMPLE_TYPE);                    typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Anonymous, false);                    typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Namespace, SchemaSymbols::fgURI_SCHEMAFORSCHEMA);                    typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Type_Definition_Name, SchemaSymbols::fgDT_ANYSIMPLETYPE);                }                if(attrInfo->getMemberTypeDefinition())                {                    typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Anonymous, attrInfo->getMemberTypeDefinition()->getAnonymous());                    typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Namespace,                         fDocument->getPooledString(attrInfo->getMemberTypeDefinition()->getNamespace()));                    typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Member_Type_Definition_Name,                         fDocument->getPooledString(attrInfo->getMemberTypeDefinition()->getName()));                }                typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Default, fDocument->getPooledString(attrInfo->getSchemaDefault()));                typeInfo->setStringProperty(DOMPSVITypeInfo::PSVI_Schema_Normalized_Value, fDocument->getPooledString(attrInfo->getSchemaNormalizedValue()));                typeInfo->setNumericProperty(DOMPSVITypeInfo::PSVI_Schema_Specified, true);                ((DOMAttrImpl*)pAttrNode)->setTypeInfo(typeInfo);            }        }    }    // associate the info now; if the user wants, she can override what we did    if(fPSVIHandler)        fPSVIHandler->handleAttributesPSVI(localName, uri, psviAttributes);}// ---------------------------------------------------------------------------//  AbstractDOMParser: Implementation of XMLDocumentHandler interface// ---------------------------------------------------------------------------void AbstractDOMParser::docCharacters(  const   XMLCh* const    chars                              , const unsigned int    length                              , const bool cdataSection){    // Ignore chars outside of content    if (!fWithinElement)        return;    // revisit.  Is it really safe to null-terminate here?    //                Does the scanner do it already?    //                If scanner goes up to the very end of an unterminated    //                buffer, we may be stepping on something bad here.    //           Probably best to modify the scanner to null terminate.    XMLCh savedChar = chars[length];    XMLCh *ncChars  = (XMLCh *)chars;   // cast off const    ncChars[length] = 0;    if (cdataSection == true)    {        DOMCDATASection *node = fDocument->createCDATASection(chars);        fCurrentParent->appendChild(node);        fCurrentNode = node;    }    else    {        if (fCurrentNode->getNodeType() == DOMNode::TEXT_NODE)        {            DOMText *node = (DOMText *)fCurrentNode;            node->appendData(chars);        }        else        {            DOMText *node = fDocument->createTextNode(chars);            fCurrentParent->appendChild(node);            fCurrentNode = node;        }    }    ncChars[length] = savedChar;    return;}void AbstractDOMParser::docComment(const XMLCh* const comment){    if (fCreateCommentNodes) {        DOMComment *dcom = fDocument->createComment(comment);        fCurrentParent->appendChild(dcom);        fCurrentNode = dcom;    }}void AbstractDOMParser::docPI(  const   XMLCh* const    target                      , const XMLCh* const    data){    DOMProcessingInstruction *pi = fDocument->createProcessingInstruction        (        target        , data        );    fCurrentParent->appendChild(pi);    fCurrentNode = pi;}void AbstractDOMParser::endEntityReference(const XMLEntityDecl&){    if (!fCreateEntityReferenceNodes) return;    DOMEntityReferenceImpl *erImpl = 0;    DOMNode* firstChild = 0;    if (fCurrentParent->getNodeType() == DOMNode::ENTITY_REFERENCE_NODE) {        erImpl = (DOMEntityReferenceImpl *) fCurrentParent;        firstChild = erImpl->getFirstChild();    }    fCurrentParent = fNodeStack->pop();    fCurrentNode   = fCurrentParent;    if (erImpl)        erImpl->setReadOnly(true, true);}void AbstractDOMParser::endElement( const   XMLElementDecl&                           , const unsigned int                           , const bool                           , const XMLCh* const){    fCurrentNode   = fCurrentParent;    fCurrentParent = fNodeStack->pop();    // If we've hit the end of content, clear the flag    if (fNodeStack->empty())        fWithinElement = false;}void AbstractDOMParser::elementTypeInfo( const   XMLCh * const  typeName                           , const XMLCh *const                 typeURI){}void AbstractDOMParser::ignorableWhitespace(const   XMLCh* const    chars                                    , const unsigned int    length                                    , const bool){    // Ignore chars before the root element    if (!fWithinElement || !fIncludeIgnorableWhitespace)        return;    // revisit.  Not safe to slam in a null like this.    XMLCh savedChar = chars[length];    XMLCh *ncChars  = (XMLCh *)chars;   // cast off const    ncChars[length] = chNull;

⌨️ 快捷键说明

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