SNAP Library, Developer Reference
2012-10-15 15:06:59
SNAP, a general purpose network analysis and graph mining library
|
00001 00002 // Xml-Object-Serialization 00003 class TXmlObjSer{ 00004 private: 00005 static TStrStrH TypeNmToTagNmH; 00006 public: 00007 static TStr GetTagNm(const TStr& TypeNm); 00008 static void AssertXmlHd( 00009 const PXmlTok& XmlTok, const TStr& Nm, const TStr& TypeNm); 00010 static bool GetBoolArg(const PXmlTok& XmlTok, const TStr& Nm); 00011 static int GetIntArg(const PXmlTok& XmlTok, const TStr& Nm); 00012 static int64 GetInt64Arg(const PXmlTok& XmlTok, const TStr& Nm); 00013 static double GetFltArg(const PXmlTok& XmlTok, const TStr& Nm); 00014 }; 00015 00017 // Xml-Object-Serialization-Tag-Name 00018 class TXmlObjSerTagNm{ 00019 private: 00020 TStr TagNm; 00021 TSOut* SOut; 00022 UndefDefaultCopyAssign(TXmlObjSerTagNm); 00023 public: 00024 TXmlObjSerTagNm( 00025 TSOut& _SOut, const bool& ETagP, 00026 const TStr& Nm, const TStr& TypeNm, 00027 const TStr& ArgNm="", const TStr& ArgVal=""); 00028 TXmlObjSerTagNm( 00029 TSOut& _SOut, const bool& ETagP, 00030 const TStr& Nm, const TStr& TypeNm, 00031 const TStr& ArgNm1, const TStr& ArgVal1, 00032 const TStr& ArgNm2, const TStr& ArgVal2, 00033 const TStr& ArgNm3="", const TStr& ArgVal3="", 00034 const TStr& ArgNm4="", const TStr& ArgVal4=""); 00035 ~TXmlObjSerTagNm(); 00036 }; 00037 00039 // Xml-Char-Definition 00040 ClassTP(TXmlChDef, PXmlChDef)//{ 00041 private: 00042 TInt Chs; 00043 TBSet CharChSet, CombChSet, ExtChSet; 00044 TBSet LetterChSet, DigitChSet, NameChSet, PubidChSet; 00045 TStrStrH EntityNmToValH; 00046 void SetChTy(TBSet& ChSet, const int& MnCh, const int& MxCh=-1); 00047 void SetChTy(TBSet& ChSet, const TStr& Str); 00048 void SetEntityVal(const TStr& Nm, const TStr& Val); 00049 public: 00050 TXmlChDef(); 00051 TXmlChDef(TSIn& SIn): 00052 Chs(SIn), 00053 CharChSet(SIn), CombChSet(SIn), ExtChSet(SIn), 00054 LetterChSet(SIn), DigitChSet(SIn), NameChSet(SIn), PubidChSet(SIn), 00055 EntityNmToValH(SIn){} 00056 static PXmlChDef Load(TSIn& SIn){return new TXmlChDef(SIn);} 00057 void Save(TSOut& SOut){ 00058 Chs.Save(SOut); 00059 CharChSet.Save(SOut); CombChSet.Save(SOut); ExtChSet.Save(SOut); 00060 LetterChSet.Save(SOut); DigitChSet.Save(SOut); NameChSet.Save(SOut); 00061 PubidChSet.Save(SOut); 00062 EntityNmToValH.Save(SOut);} 00063 00064 TXmlChDef& operator=(const TXmlChDef&){Fail; return *this;} 00065 00066 bool IsChar(const uchar& Ch) const {return CharChSet.GetBit(Ch);} 00067 bool IsComb(const uchar& Ch) const {return CombChSet.GetBit(Ch);} 00068 bool IsExt(const uchar& Ch) const {return ExtChSet.GetBit(Ch);} 00069 bool IsLetter(const uchar& Ch) const {return LetterChSet.GetBit(Ch);} 00070 bool IsDigit(const uchar& Ch) const {return DigitChSet.GetBit(Ch);} 00071 bool IsName(const uchar& Ch) const {return NameChSet.GetBit(Ch);} 00072 bool IsPubid(const uchar& Ch) const {return PubidChSet.GetBit(Ch);} 00073 00074 bool IsWs(const uchar& Ch) const { 00075 return (Ch==' ')||(Ch==TCh::CrCh)||(Ch==TCh::LfCh)||(Ch==TCh::TabCh);} 00076 bool IsFirstNameCh(const uchar& Ch) const { 00077 return IsLetter(Ch)||(Ch=='_')||(Ch==':');} 00078 bool IsEoln(const uchar& Ch) const { 00079 return (Ch==TCh::CrCh)||(Ch==TCh::LfCh);} 00080 00081 bool IsEntityNm(const TStr& EntityNm, TStr& EntityVal) const { 00082 return EntityNmToValH.IsKeyGetDat(EntityNm, EntityVal);} 00083 }; 00084 00086 // Xml-Lexical 00087 typedef enum { 00088 xsyUndef, xsyWs, xsyComment, 00089 xsyXmlDecl, xsyPI, 00090 xsyDocTypeDecl, xsyElement, xsyAttList, xsyEntity, xsyNotation, 00091 xsyTag, xsySTag, xsyETag, xsySETag, xsyStr, xsyQStr, 00092 xsyEof} TXmlLxSym; 00093 00094 typedef enum {xspIntact, xspPreserve, xspSeparate, xspTruncate} TXmlSpacing; 00095 00096 class TXmlLx{ 00097 private: // character level functions 00098 static TXmlChDef ChDef; 00099 PSIn SIn; 00100 TSIn& RSIn; 00101 TChA ChStack; 00102 uchar PrevCh, Ch; 00103 int LnN, LnChN, ChN; 00104 TXmlSpacing Spacing; 00105 uchar GetCh(); 00106 void PutCh(const uchar& _Ch){ChStack.Push(Ch); Ch=_Ch;} 00107 void PutStr(const TStr& Str){ 00108 for (int ChN=Str.Len()-1; ChN>=0; ChN--){PutCh(Str[ChN]);}} 00109 void ToNrSpacing(); 00110 private: // part-of-symbol level functions 00111 TStrStrH EntityNmToValH, PEntityNmToValH; 00112 void GetWs(const bool& IsRq); 00113 TStr GetReference(); 00114 void GetEq(); 00115 TStr GetName(); 00116 TStr GetName(const TStr& RqNm); 00117 void GetComment(); 00118 TStr GetAttValue(); 00119 TStr GetVersionNum(); 00120 TStr GetEncName(); 00121 TStr GetStalVal(); 00122 void GetXmlDecl(); 00123 void GetPI(); 00124 TStr GetSystemLiteral(); 00125 TStr GetPubidLiteral(); 00126 TStr GetPEReference(); 00127 void GetExternalId(); 00128 void GetNData(); 00129 void GetDocTypeDecl(); 00130 void GetElement(); 00131 void GetAttList(); 00132 TStr GetEntityValue(); 00133 void GetEntity(); 00134 void GetNotation(); 00135 void GetCDSect(); 00136 public: // symbol state 00137 TXmlLxSym Sym; 00138 TChA TxtChA; 00139 TStr TagNm; 00140 TStrKdV ArgNmValKdV; 00141 void SkipWs(); 00142 public: 00143 TXmlLx(const PSIn& _SIn, const TXmlSpacing& _Spacing=xspIntact): 00144 SIn(_SIn), RSIn(*SIn), 00145 ChStack(), PrevCh(' '), Ch(' '), 00146 LnN(1), LnChN(0), ChN(0), Spacing(_Spacing), 00147 EntityNmToValH(100), PEntityNmToValH(100), 00148 Sym(xsyUndef), TxtChA(), TagNm(), ArgNmValKdV(10){GetCh();} 00149 00150 TXmlLx& operator=(const TXmlLx&){Fail; return *this;} 00151 00152 TXmlLxSym GetSym(); 00153 TStr GetSymStr() const; 00154 void EThrow(const TStr& MsgStr) const; 00155 TStr GetFPosStr() const; 00156 00157 // tag arguments 00158 void ClrArgV(){ArgNmValKdV.Clr();} 00159 void AddArg(const TStr& ArgNm, const TStr& ArgVal){ 00160 ArgNmValKdV.Add(TStrKd(ArgNm, ArgVal));} 00161 bool IsArgNm(const TStr& ArgNm) const { 00162 return ArgNmValKdV.IsIn(TStrKd(ArgNm));} 00163 int GetArgs() const {return ArgNmValKdV.Len();} 00164 void GetArg(const int& ArgN, TStr& ArgNm, TStr& ArgVal) const { 00165 ArgNm=ArgNmValKdV[ArgN].Key; ArgVal=ArgNmValKdV[ArgN].Dat;} 00166 TStr GetArgVal(const TStr& ArgNm, const TStr& DfVal=TStr()) const { 00167 int ArgN=ArgNmValKdV.SearchForw(TStrKd(ArgNm)); 00168 if (ArgN==-1){return DfVal;} else {return ArgNmValKdV[ArgN].Dat;}} 00169 static char GetArgValQCh(const TStr& ArgVal){ 00170 if (ArgVal.IsChIn('\"')){return '\'';} else {return '\"';}} 00171 00172 // entities 00173 bool IsEntityNm(const TStr& EntityNm, TStr& EntityVal) const { 00174 return EntityNmToValH.IsKeyGetDat(EntityNm, EntityVal);} 00175 void PutEntityVal(const TStr& Nm, const TStr& Val){ 00176 EntityNmToValH.AddDat(Nm, Val);} 00177 bool IsPEntityNm(const TStr& EntityNm, TStr& EntityVal) const { 00178 return PEntityNmToValH.IsKeyGetDat(EntityNm, EntityVal);} 00179 void PutPEntityVal(const TStr& Nm, const TStr& Val){ 00180 PEntityNmToValH.AddDat(Nm, Val);} 00181 00182 // symbol to string conversion 00183 static TStr GetXmlLxSymStr(const TXmlLxSym& XmlLxSym); 00184 00185 // string conversion 00186 static bool IsTagNm(const TStr& Str); 00187 static TStr GetXmlStrFromPlainMem(const TMem& PlainMem); 00188 static TStr GetXmlStrFromPlainStr(const TChA& PlainChA); 00189 static TStr GetPlainStrFromXmlStr(const TStr& XmlStr); 00190 static TStr GetUsAsciiStrFromXmlStr(const TStr& EntRefStr); 00191 static TStr GetChRefFromYuEntRef(const TStr& YuEntRefStr); 00192 }; 00193 00195 // Xml-Token 00196 ClassTPV(TXmlTok, PXmlTok, TXmlTokV)//{ 00197 private: 00198 TXmlLxSym Sym; 00199 TStr Str; 00200 TStrKdV ArgNmValV; 00201 TXmlTokV SubTokV; 00202 public: 00203 TXmlTok(): Sym(xsyUndef), Str(), ArgNmValV(), SubTokV(){} 00204 TXmlTok(const TXmlLxSym& _Sym): 00205 Sym(_Sym), Str(), ArgNmValV(), SubTokV(){} 00206 TXmlTok(const TXmlLxSym& _Sym, const TStr& _Str): 00207 Sym(_Sym), Str(_Str), ArgNmValV(), SubTokV(){} 00208 TXmlTok(const TXmlLxSym& _Sym, const TStr& _Str, const TStrKdV& _ArgNmValV): 00209 Sym(_Sym), Str(_Str), ArgNmValV(_ArgNmValV){} 00210 static PXmlTok New(){return PXmlTok(new TXmlTok());} 00211 static PXmlTok New(const TXmlLxSym& Sym){return PXmlTok(new TXmlTok(Sym));} 00212 static PXmlTok New(const TXmlLxSym& Sym, const TStr& Str){ 00213 return PXmlTok(new TXmlTok(Sym, Str));} 00214 static PXmlTok New( 00215 const TXmlLxSym& Sym, const TStr& Str, const TStrKdV& ArgNmValV){ 00216 return PXmlTok(new TXmlTok(Sym, Str, ArgNmValV));} 00217 static PXmlTok New( 00218 const TStr& TagNm, const TStrKdV& ArgNmValV){ 00219 return PXmlTok(new TXmlTok(xsyTag, TagNm, ArgNmValV));} 00220 static PXmlTok New(const TStr& TagNm){ 00221 return PXmlTok(new TXmlTok(xsyTag, TagNm));} 00222 static PXmlTok New(const TStr& TagNm, const TStr& ValStr){ 00223 PXmlTok TagXmlTok=PXmlTok(new TXmlTok(xsyTag, TagNm)); 00224 PXmlTok StrXmlTok=PXmlTok(new TXmlTok(xsyStr, ValStr)); 00225 TagXmlTok->AddSubTok(StrXmlTok); return TagXmlTok;} 00226 static PXmlTok New(const TStr& TagNm, 00227 const PXmlTok& XmlTok1, const PXmlTok& XmlTok2=NULL){ 00228 PXmlTok TagXmlTok=PXmlTok(new TXmlTok(xsyTag, TagNm)); 00229 if (!XmlTok1.Empty()){TagXmlTok->AddSubTok(XmlTok1);} 00230 if (!XmlTok2.Empty()){TagXmlTok->AddSubTok(XmlTok2);} 00231 return TagXmlTok;} 00232 TXmlTok(TSIn&){Fail;} 00233 static PXmlTok Load(TSIn&){Fail; return NULL;} 00234 void Save(TSOut&){Fail;} 00235 00236 TXmlTok& operator=(const TXmlTok&){Fail; return *this;} 00237 00238 // type-of-token and text value (xsyWs, xsyStr, xsyQStr, xsyTag) 00239 TXmlLxSym GetSym() const {return Sym;} 00240 TStr GetSymStr() const {return TXmlLx::GetXmlLxSymStr(Sym);} 00241 void PutStr(const TStr& _Str){Str=_Str;} 00242 TStr GetStr() const {return Str;} 00243 00244 // tags 00245 bool IsTag() const {return (Sym==xsyTag);} 00246 bool IsTag(const TStr& TagNm) const {return (Sym==xsyTag)&&(Str==TagNm);} 00247 TStr GetTagNm() const {IAssert(Sym==xsyTag); return Str;} 00248 00249 // tag argument 00250 void AddArg(const TStr& ArgNm, const bool& ArgVal){ 00251 ArgNmValV.Add(TStrKd(ArgNm, TBool::GetStr(ArgVal)));} 00252 void AddArg(const TStr& ArgNm, const int& ArgVal){ 00253 ArgNmValV.Add(TStrKd(ArgNm, TInt::GetStr(ArgVal)));} 00254 void AddArg(const TStr& ArgNm, const uint64& ArgVal){ 00255 ArgNmValV.Add(TStrKd(ArgNm, TUInt64::GetStr(ArgVal)));} 00256 void AddArg(const TStr& ArgNm, const double& ArgVal){ 00257 ArgNmValV.Add(TStrKd(ArgNm, TFlt::GetStr(ArgVal)));} 00258 void AddArg(const TStr& ArgNm, const TStr& ArgVal){ 00259 ArgNmValV.Add(TStrKd(ArgNm, ArgVal));} 00260 int GetArgs() const {return ArgNmValV.Len();} 00261 void GetArg(const int& ArgN, TStr& ArgNm, TStr& ArgVal) const { 00262 ArgNm=ArgNmValV[ArgN].Key; ArgVal=ArgNmValV[ArgN].Dat;} 00263 bool IsArg(const TStr& ArgNm) const { 00264 return ArgNmValV.SearchForw(TStrKd(ArgNm))!=-1;} 00265 bool IsArg(const TStr& ArgNm, TStr& ArgVal) const { 00266 int ArgN=ArgNmValV.SearchForw(TStrKd(ArgNm)); 00267 if (ArgN!=-1){ArgVal=ArgNmValV[ArgN].Dat;} 00268 return ArgN!=-1;} 00269 void PutArgVal(const TStr& ArgNm, const TStr& ArgVal){ 00270 ArgNmValV[ArgNmValV.SearchForw(TStrKd(ArgNm))].Dat=ArgVal;} 00271 TStr GetArgVal(const TStr& ArgNm) const { 00272 return ArgNmValV[ArgNmValV.SearchForw(TStrKd(ArgNm))].Dat;} 00273 TStr GetArgVal(const TStr& ArgNm, const TStr& DfArgVal) const { 00274 int ArgN=ArgNmValV.SearchForw(TStrKd(ArgNm)); 00275 return (ArgN==-1) ? DfArgVal : ArgNmValV[ArgN].Dat;} 00276 bool GetBoolArgVal(const TStr& ArgNm, const bool& DfVal=false) const; 00277 bool GetBoolArgVal( 00278 const TStr& ArgNm, const TStr& TrueVal, const bool& DfVal=false) const; 00279 bool GetBoolArgVal(const TStr& ArgNm, 00280 const TStr& TrueVal, const TStr& FalseVal, const bool& DfVal=false) const; 00281 int GetIntArgVal(const TStr& ArgNm, const int& DfVal=0) const; 00282 double GetFltArgVal(const TStr& ArgNm, const double& DfVal=0) const; 00283 TStr GetStrArgVal(const TStr& ArgNm, const TStr& DfVal=TStr()) const; 00284 00285 // sub tokens 00286 bool IsSubTag(const TStr& TagNm) const { 00287 return !GetTagTok(TagNm).Empty();} 00288 bool IsSubTag(const TStr& TagNm, PXmlTok& Tok) const { 00289 Tok=GetTagTok(TagNm); return !Tok.Empty();} 00290 void AddSubTok(const PXmlTok& Tok){SubTokV.Add(Tok);} 00291 int GetSubToks() const {return SubTokV.Len();} 00292 PXmlTok GetSubTok(const int& SubTokN) const {return SubTokV[SubTokN];} 00293 void ClrSubTok(){SubTokV.Clr();} 00294 void PutSubTok(const PXmlTok& Tok, const int& SubTokN=-1); 00295 00296 // value retrieval 00297 bool IsTagTok(const TStr& TagPath, PXmlTok& TagTok) const { 00298 TagTok=GetTagTok(TagPath); return !TagTok.Empty();} 00299 bool IsTagTok(const TStr& TagPath) const { 00300 PXmlTok TagTok; return IsTagTok(TagPath, TagTok);} 00301 PXmlTok GetTagTok(const TStr& TagPath) const; 00302 void GetTagTokV(const TStr& TagPath, TXmlTokV& XmlTokV) const; 00303 void GetTagValV(const TStr& TagNm, const bool& XmlP, TStrV& ValV) const; 00304 TStr GetTagVal(const TStr& TagNm, const bool& XmlP) const; 00305 TStr GetTagTokStr(const TStr& TagPath) const { 00306 return GetTagTok(TagPath)->GetTokStr(false);} 00307 TStr GetTagTokStrOrDf(const TStr& TagPath, const TStr& DfVal=TStr()) const { 00308 PXmlTok TagTok; 00309 if (IsTagTok(TagPath, TagTok)){return TagTok->GetTokStr(false);} 00310 else {return DfVal;}} 00311 00312 // string representation for the token 00313 void AddTokToChA(const bool& XmlP, TChA& ChA) const; 00314 TStr GetTokStr(const bool& XmlP=true) const { 00315 TChA ChA; AddTokToChA(XmlP, ChA); return ChA;} 00316 static TStr GetTokVStr(const TXmlTokV& TokV, const bool& XmlP=true); 00317 00318 // convert current lexical symbol to token 00319 static PXmlTok GetTok(TXmlLx& Lx); 00320 }; 00321 00323 // Xml-Document 00324 ClassTPV(TXmlDoc, PXmlDoc, TXmlDocV)//{ 00325 private: 00326 bool Ok; 00327 TStr MsgStr; 00328 PXmlTok Tok; 00329 static void LoadTxtMiscStar(TXmlLx& Lx); 00330 static PXmlTok LoadTxtElement(TXmlLx& Lx); 00331 public: 00332 TXmlDoc(): Ok(false), MsgStr(), Tok(){} 00333 static PXmlDoc New(){return PXmlDoc(new TXmlDoc());} 00334 TXmlDoc(const PXmlTok& _Tok): Ok(!_Tok.Empty()), MsgStr(), Tok(_Tok){} 00335 static PXmlDoc New(const PXmlTok& Tok){return PXmlDoc(new TXmlDoc(Tok));} 00336 TXmlDoc(TSIn&){Fail;} 00337 static PXmlDoc Load(TSIn& SIn){return new TXmlDoc(SIn);} 00338 void Save(TSOut&){Fail;} 00339 00340 TXmlDoc& operator=(const TXmlDoc&){Fail; return *this;} 00341 00342 // component retrieval 00343 bool IsOk() const {return Ok;} 00344 TStr GetMsgStr() const {return MsgStr;} 00345 PXmlTok GetTok() const {IAssert(Ok); return Tok;} 00346 00347 // value retrieval 00348 bool IsTagTok(const TStr& TagPath, PXmlTok& TagTok) const { 00349 IAssert(Ok); TagTok=GetTagTok(TagPath); return !TagTok.Empty();} 00350 bool IsTagTok(const TStr& TagPath) const { 00351 PXmlTok TagTok; return IsTagTok(TagPath, TagTok);} 00352 PXmlTok GetTagTok(const TStr& TagPath) const; 00353 void PutTagTokStr(const TStr& TagPath, const TStr& TokStr) const; 00354 TStr GetTagTokStr(const TStr& TagPath) const { 00355 return GetTagTok(TagPath)->GetTokStr(false);} 00356 void GetTagTokV(const TStr& TagPath, TXmlTokV& XmlTokV) const; 00357 void GetTagValV(const TStr& TagNm, const bool& XmlP, TStrV& ValV) const { 00358 IAssert(Ok); Tok->GetTagValV(TagNm, XmlP, ValV);} 00359 TStr GetTagVal(const TStr& TagNm, const bool& XmlP) const { 00360 TStrV ValV; GetTagValV(TagNm, XmlP, ValV); 00361 if (ValV.Len()>0){return ValV[0];} else {return "";}} 00362 bool GetTagTokBoolArgVal( 00363 const TStr& TagPath, const TStr& ArgNm, const bool& DfVal=false) const; 00364 int GetTagTokIntArgVal( 00365 const TStr& TagPath, const TStr& ArgNm, const int& DfVal=0) const; 00366 double GetTagTokFltArgVal( 00367 const TStr& TagPath, const TStr& ArgNm, const double& DfVal=0) const; 00368 TStr GetTagTokStrArgVal( 00369 const TStr& TagPath, const TStr& ArgNm, const TStr& DfVal=TStr()) const; 00370 00371 // string representation 00372 static TStr GetXmlStr(const TStr& Str); 00373 00374 // loading/saving document 00375 static bool SkipTopTag(const PSIn& SIn); 00376 static PXmlDoc LoadTxt(TXmlLx& Lx); 00377 static PXmlDoc LoadTxt(const PSIn& SIn, const TXmlSpacing& Spacing=xspIntact); 00378 static PXmlDoc LoadTxt(const TStr& FNm, const TXmlSpacing& Spacing=xspIntact); 00379 static void LoadTxt( 00380 const TStr& FNm, TXmlDocV& XmlDocV, const TXmlSpacing& Spacing=xspIntact); 00381 void SaveTxt(const PSOut& SOut){ 00382 SOut->PutStr(GetTok()->GetTokStr());} 00383 void SaveTxt(const TStr& FNm, const bool& Append=false){ 00384 PSOut SOut=TFOut::New(FNm, Append); SaveTxt(SOut);} 00385 static PXmlDoc LoadStr(const TStr& Str); 00386 void SaveStr(TStr& Str); 00387 }; 00388 00390 // Fast and dirty XML parser 00391 // very basic it does only <item>string</item>, no comments, no arguments 00392 class TXmlParser; 00393 typedef TPt<TXmlParser> PXmlParser; 00394 00395 class TXmlParser { //J: 00396 private: 00397 TCRef CRef; 00398 PSIn SIn; 00399 TSIn& RSIn; 00400 TChA _SymStr; 00401 public: 00402 TXmlLxSym Sym, NextSym; 00403 TChA SymStr, NextSymStr; 00404 private: 00405 char GetCh() { return (! RSIn.Eof()) ? RSIn.GetCh() : TCh::EofCh; } 00406 public: 00407 TXmlParser(const PSIn& _SIn) : SIn(_SIn), RSIn(*SIn), Sym(xsyUndef), NextSym(xsyUndef) { } 00408 static PXmlParser New(const PSIn& SIn) { return new TXmlParser(SIn); } 00409 00410 TXmlLxSym GetSym(); 00411 TXmlLxSym GetSym(TChA& _SymStr); 00412 TXmlLxSym PeekSym(); 00413 TXmlLxSym PeekSym(TChA& _SymStr); 00414 void SkipTillTag(const TChA& _SymStr); 00415 00416 TXmlLxSym GetTag(const TChA& TagStr); 00417 void GetTagVal(const TChA& TagStr, TChA& TagVal); 00418 00419 static void GetPlainStrFromXmlStr(const TChA& XmlStr, TChA& PlainChA); 00420 friend class TPt<TXmlParser>; 00421 };