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