datatypevalidator.cpp
来自「IBM的解析xml的工具Xerces的源代码」· C++ 代码 · 共 645 行 · 第 1/2 页
CPP
645 行
serEng<<(int)fType; serEng<<(int)fOrdered; serEng<<fFinite; serEng<<fBounded; serEng<<fNumeric; storeDV(serEng, fBaseValidator); /*** * Serialize RefHashTableOf<KVStringPair> ***/ XTemplateSerializer::storeObject(fFacets, serEng); serEng.writeString(fPattern); if (fTypeUri==XMLUni::fgZeroLenString) { serEng<<TYPENAME_ZERO; } else if (fTypeUri == SchemaSymbols::fgURI_SCHEMAFORSCHEMA) { serEng<<TYPENAME_S4S; serEng.writeString(fTypeLocalName); } else { serEng<<TYPENAME_NORMAL; serEng.writeString(fTypeLocalName); serEng.writeString(fTypeUri); } /*** * don't serialize * fRegex ***/ } else { serEng>>fAnonymous; serEng>>fWhiteSpace; serEng>>fFinalSet; serEng>>fFacetsDefined; serEng>>fFixed; int type; serEng>>type; fType=(ValidatorType)type; serEng>>type; fOrdered = (XSSimpleTypeDefinition::ORDERING)type; serEng>>fFinite; serEng>>fBounded; serEng>>fNumeric; fBaseValidator = loadDV(serEng); /*** * * Deserialize RefHashTableOf<KVStringPair> * ***/ XTemplateSerializer::loadObject(&fFacets, 29, true, serEng); serEng.readString(fPattern); /*** * Recreate through setTypeName() * fTypeName ***/ int flag; serEng>>flag; if ( TYPENAME_ZERO == flag ) { setTypeName(0); } else if ( TYPENAME_S4S == flag ) { XMLCh* typeLocalName; serEng.readString(typeLocalName); ArrayJanitor<XMLCh> janName(typeLocalName, fMemoryManager); setTypeName(typeLocalName); } else // TYPENAME_NORMAL { XMLCh* typeLocalName; serEng.readString(typeLocalName); ArrayJanitor<XMLCh> janName(typeLocalName, fMemoryManager); XMLCh* typeUri; serEng.readString(typeUri); ArrayJanitor<XMLCh> janUri(typeUri, fMemoryManager); setTypeName(typeLocalName, typeUri); } /*** * don't serialize fRegex ***/ fRegex = 0; }}/*** * * When deserialized, we need to know, exactly what * validator was serialized here. * * Design Issue: * * This extra type information is only necessary when * we need to create and deserialize an DatatypeValidator * derivative by operator >>, but not by object.serialize(). * Therefore it is appropriate to save this type info by * hosting object rather than by derivative.serialize(). * * ***/void DatatypeValidator::storeDV(XSerializeEngine& serEng , DatatypeValidator* const dv){ if (dv) { //builtIndv if (dv == DatatypeValidatorFactory::getBuiltInRegistry()->get(dv->getTypeLocalName())) { serEng<<DV_BUILTIN; serEng.writeString(dv->getTypeLocalName()); } else { serEng<<DV_NORMAL; serEng<<(int) dv->getType(); serEng<<dv; } } else { serEng<<DV_ZERO; }}DatatypeValidator* DatatypeValidator::loadDV(XSerializeEngine& serEng){ int flag; serEng>>flag; if (DV_BUILTIN == flag) { XMLCh* dvName; serEng.readString(dvName); ArrayJanitor<XMLCh> janName(dvName, serEng.getMemoryManager()); return DatatypeValidatorFactory::getBuiltInRegistry()->get(dvName); } else if (DV_ZERO == flag) { return 0; } int type; serEng>>type; switch((ValidatorType)type) { case String: StringDatatypeValidator* stringdv; serEng>>stringdv; return stringdv; case AnyURI: AnyURIDatatypeValidator* anyuridv; serEng>>anyuridv; return anyuridv; case QName: QNameDatatypeValidator* qnamedv; serEng>>qnamedv; return qnamedv; case Name: NameDatatypeValidator* namedv; serEng>>namedv; return namedv; case NCName: NCNameDatatypeValidator* ncnamedv; serEng>>ncnamedv; return ncnamedv; case Boolean: BooleanDatatypeValidator* booleandv; serEng>>booleandv; return booleandv; case Float: FloatDatatypeValidator* floatdv; serEng>>floatdv; return floatdv; case Double: DoubleDatatypeValidator* doubledv; serEng>>doubledv; return doubledv; case Decimal: DecimalDatatypeValidator* decimaldv; serEng>>decimaldv; return decimaldv; case HexBinary: HexBinaryDatatypeValidator* hexbinarydv; serEng>>hexbinarydv; return hexbinarydv; case Base64Binary: Base64BinaryDatatypeValidator* base64binarydv; serEng>>base64binarydv; return base64binarydv; case Duration: DurationDatatypeValidator* durationdv; serEng>>durationdv; return durationdv; case DateTime: DateTimeDatatypeValidator* datetimedv; serEng>>datetimedv; return datetimedv; case Date: DateDatatypeValidator* datedv; serEng>>datedv; return datedv; case Time: TimeDatatypeValidator* timedv; serEng>>timedv; return timedv; case MonthDay: MonthDayDatatypeValidator* monthdaydv; serEng>>monthdaydv; return monthdaydv; case YearMonth: YearMonthDatatypeValidator* yearmonthdv; serEng>>yearmonthdv; return yearmonthdv; case Year: YearDatatypeValidator* yeardv; serEng>>yeardv; return yeardv; case Month: MonthDatatypeValidator* monthdv; serEng>>monthdv; return monthdv; case Day: DayDatatypeValidator* daydv; serEng>>daydv; return daydv; case ID: IDDatatypeValidator* iddv; serEng>>iddv; return iddv; case IDREF: IDREFDatatypeValidator* idrefdv; serEng>>idrefdv; return idrefdv; case ENTITY: ENTITYDatatypeValidator* entitydv; serEng>>entitydv; return entitydv; case NOTATION: NOTATIONDatatypeValidator* notationdv; serEng>>notationdv; return notationdv; case List: ListDatatypeValidator* listdv; serEng>>listdv; return listdv; case Union: UnionDatatypeValidator* uniondv; serEng>>uniondv; return uniondv; case AnySimpleType: AnySimpleTypeDatatypeValidator* anysimpletypedv; serEng>>anysimpletypedv; return anysimpletypedv; case UnKnown: return 0; default: //we treat this same as UnKnown return 0; }}/** * Canonical Representation * */const XMLCh* DatatypeValidator::getCanonicalRepresentation(const XMLCh* const rawData , MemoryManager* const memMgr , bool toValidate) const{ MemoryManager* toUse = memMgr? memMgr : fMemoryManager; if (toValidate) { DatatypeValidator *temp = (DatatypeValidator*) this; try { temp->validate(rawData, 0, toUse); } catch (...) { return 0; } } return XMLString::replicate(rawData, toUse);}XERCES_CPP_NAMESPACE_END/** * End of file DatatypeValidator.cpp */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?