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