SNAP Library, Developer Reference  2012-10-15 15:06:59
SNAP, a general purpose network analysis and graph mining library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
xml.h
Go to the documentation of this file.
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 };