.


:




:

































 

 

 

 


1. XML




, .

, , , ( ). () . ( ) , , .

: , , - , . .

, , -.

. . . , .

 

, . . 1. , , .

. 1.

. , . , , . .

. , . , : , , , .. .

, :

- // /;

- /// ;

- ;

- .

.

 

. , ( , ..), , .

 

. , . , , .. .

1. . CVariant

. .

. ( Variant type) , . COM.

Object Pascal (IDE Delphi):

procedure VariantTest();

Var

v: Variant;

Begin

v:=5; // v 5

v:='abc'; // v abc

v:=6.1; // v 6.1

end;

.

 

, , , (1 ), :

enum VarType {vtNone, vtInt, vtFloat, vtChar, vtStr};

, .

 

CVariant :

class CVariant

{protected:

VarType type;

union VariantData

{ int i;

float f;

char c;

char* pc;

} datum;

void StrDealloc()

{ if(type==vtStr) delete [] datum.pc; };

public:

CVariant& operator=(const CVariant& v);

CVariant() { type=vtNone; };

CVariant& operator=(float f);

CVariant& operator=(int i);

CVariant& operator=(char c);

CVariant& operator=(char* pc);

virtual ~CVariant() { StrDealloc(); };

VarType GetType() { return type; };

operator int();

operator float();

operator char();

operator char*();

};

 

(protected) ( VarType type) ( VariantData datum, VariantData ).

CVariant , datum.pc ( ) . StrDealloc() , /.

 

StrDealloc() , (inline) -. , . . : inline int Get5() { return 5; } 5.

 

(public) , , GetType(), .

 

. , (vtNone) .

 

(=) , :

CVariant v;

int i=5;

v=i;

, = :

CVariant& CVariant::operator =(int i)

{ StrDealloc(); //

type=vtInt; //

datum.i=i; //

return *this; //

};

= , . . :

CVariant v;

int i=5, j;

j=v=i; // : j==5, v==5, v.type==vtInt

 

, :

CVariant v=5;

int i;

i=v;

, int :

CVariant::operator int()

{ switch(type) //

{case vtChar:

return datum.c; //

case vtInt:

return datum.i; //

case vtFloat:

return static_cast<int>(datum.f); //

case vtStr:

return *datum.pc; //

}

return 0; // 0

};

 

, .. . .

 

( , ) , , .

 

= , , . (conversion constructors) . : CVariant v; v=abcd; // , char* pc=v; // pc , v.datum.pc std::cout<<pc; // pc : - - CVariant(char*) abcd; - v ; - . . , : CVariant& CVariant::operator=(const CVariant &v) { StrDealloc(); type=v.type; if(type!=vtStr) datum=v.datum; else { datum.pc=new char[strlen(v.datum.pc)+1]; strcpy(datum.pc,v.datum.pc); } return *this; } , , . , , v.datum.pc . , . . v. , , .. . . : #ifdef ConversionByConstructor #else #endif

 

.

  1. : CVariant.h, CVariant.cpp.
  2. CVariant.

 

.

  1. , CVariant ?
  2. , , CVariant.

2.

( ) , () . .. , , .

- , - . .

. :

- ;

- , - .

, (, ) , , , .. . 2.

. 2.

, . . . 3.

. 3. ,

- (static) . , , .. .

 

, .

CListInfo, :

class CListInfo

{ int RefCount;

bool Sorted;

int SortCriterion;

CSimpList* FirstElement;

CSimpList* LastElement;

void Inc() { RefCount++; };

void Dec() { RefCount--; if(RefCount<=0) delete this; }; // -

CListInfo(CSimpList* List) { RefCount=SortCriterion=0;

Sorted=false;

FirstElement=LastElement=List;

};

friend CSimpList;

};

CListInfo :

- RefCount ( ).

- Sorted, SortCriterion , . , , . , , .

- FirstElement, LastElement .

 

/ Inc() Dec(), RefCount (.. ) . (. CSimpList).

 

COM (Component Object Model). COM ActiveX.

 

CListInfo (private ), .. . CSimpList, (friend), . , CListInfo .

 

CSimpList, :

class CSimpList

{protected:

CSimpList* next; //

CSimpList* prev; //

CListInfo* ListInfo; //

void BubbleUp(); // .

// , ,

public:

CSimpList(CSimpList *List = NULL); //

virtual ~CSimpList(); //

// :

virtual bool operator==(CSimpList &List) = 0;

virtual bool operator>(CSimpList &List) = 0;

virtual bool operator<(CSimpList &List) = 0;

// :

virtual CSimpList* Next() { return next; };

virtual CSimpList* Prev() { return prev; };

virtual CSimpList* First() { return ListInfo->FirstElement; };

virtual CSimpList* Last() { return ListInfo->LastElement; };

int Count() { return ListInfo->RefCount; }; //

// :

virtual bool Add(CSimpList* Elem);

virtual CSimpList* Remove();

virtual CSimpList* Sort(int Criterion = 0); //

int SortCriterion() { return ListInfo->SortCriterion; }; //

};

, , .

.

(prev next), , (ListInfo). protected, , , -. , prev / next , / .

List*, , , ( ), . , .

:

CSimpList::CSimpList(CSimpList *List)

{ next=prev=NULL; // /

if(List) // List (.. , )

{ ListInfo=NULL;

List->Add(this); //

}

else // List

{ ListInfo=new CListInfo(this); //

ListInfo->Inc(); //

}

};

:

CSimpList::~CSimpList()

{

ListInfo->Dec();

};

 

CSimpList . , , , . ( ):

A *a;

B *b;

b=new B;

a=b;

delete a;

.

, - CSimpList ~CSimpList() .

 

(pure virtual), . , , . .

 

-. . , CSimpList , .. . , , , . .

/ / .

Count, , , RefCount . / .

 

.

:

CSimpList* CSimpList::Remove()

{ if(next || prev) //

{ if(!next) //

{ // , , :

ListInfo->LastElement=prev;

prev->next=NULL;

}

else if(!prev) //

{ // , , :

ListInfo->FirstElement=next;

next->prev=NULL;

}

else // ,

{ // :

next->prev=prev;

prev->next=next;

}

CListInfo *tmpListInfo=ListInfo;

ListInfo->Dec(); //

prev=next=NULL; //

ListInfo=new CListInfo(this); //

ListInfo->Inc();

return tmpListInfo->FirstElement; // ,

}

return NULL;

}

, , . , . .

 

:

bool CSimpList::Add(CSimpList* Elem)

{ if(Elem && Elem->ListInfo!=ListInfo) // Elem

{ if(Elem->Count()>1) //

return false;

// Elem :

ListInfo->LastElement->next=Elem;

Elem->prev=ListInfo->LastElement;

Elem->next=NULL;

Elem->ListInfo=ListInfo;

ListInfo->LastElement=Elem;

ListInfo->Inc(); //

ListInfo->Sorted=false; //

return true;

}

return false;

}

 

Remove() , Add() , , :

CSimpList *a,*b;

// a b

CSimpList *c=a; // , (1)

a=c->Remove(); // (2)

b.Add(&c); // b

. , ( a (1)). , ( a (2) , ).

 

CSimpList - >.

BubbleUp(), ( ):

void CSimpList::BubbleUp()

{ if(next) //

{ if(prev) //

prev->next=next; //

else

ListInfo->FirstElement=next; //

next->prev=prev; //

if(next->next) //

next->next->prev=this; //

else

ListInfo->LastElement=this; //

prev=next; //

next=next->next; //

prev->next=this; // ,

}

ListInfo->Sorted=false; //

}

. .

Sort(), , . , , , , . Sort() Criterion .

 

CSimpList* CSimpList::Sort(int Criterion)

{ if(ListInfo->SortCriterion!=Criterion ||!ListInfo->Sorted) //

{ ListInfo->SortCriterion=Criterion; //

CSimpList* le; //

bool swapped; // ,

do

{ le=ListInfo->FirstElement; //

swapped=false; //

// :

while(le->next) //

{ if(*le>*le->next) // le

{ le->BubbleUp(); // le

swapped=true; // ,

}

else //

le=le->next; //

}

} while(swapped); // ,

ListInfo->Sorted=true; //

}

return ListInfo->FirstElement; //

};

CSimpList:

class CSomeList: public CSimpList

{public:

int i,j; // ,

CSomeList(CSomeList* List=NULL): CSimpList(List) {} //

bool operator==(CSimpList &List) { }; //

bool operator<(CSimpList &List) { }; // <

bool operator>(CSimpList &List) // >

{ if(SortCriterion()==0) // i

return i > (static_cast<CSomeList&>(List).i);

else // j

return j > (static_cast<CSomeList&>(List).j);

};

CSomeList* Sort(int Criterion = 0) //

{ return static_cast<CSomeList*>(CSimpList::Sort(Criterion)); };

void Show(); //

//

};

> , , i, j . static_cast<CSomeList&> .

 

Sort() . , . , ( CSomeClass::Sort()).

CSimpList, CSimpList*. , , / .

 

.

  1. : CSimpList.h, CSimpList.cpp.
  2. . -, .

 

.

  1. > (, , <). , . . (.. , ==) . , - - , . ?
  2. , , (. ). CSimpList ?

 

3. .

, .

- , , . , , .

XML (eXtensible Markup Language ). , . 1 .

, . , , :

<table Name= >

<fields>

<field ID=1 type=Integer>

</field>

<field name=2 type=String length=32>

</field>

</fields>

<records>

<record>

<value field=1>

56234

</value>

<value field=2>

..

</value>

</record>

<record>

<value field=1>

56233

</value>

<value field=2>

..

</value>

</record>

</records>

</table>

(tag , , .) , . - . , :

<TagName>

</TagName>,

, .

():

<TagName attrib1=value1 attrib2=value2>,

attribXX , valueXX .

, .. :

<Tag1> <Tag2> </Tag1> </Tag2>.

<table>-</table> , <fields>-</fields> - , <field>-</field> - ..

, . . :

- , . , .

- . , . , . , , .

 

CFileParser, :

using namespace std; //

class CFileParser

{ // :

string FileName; // (. ). . string

string CurTagName; //

string ParamString; //

bool TagCached; // , ( , )

fstream SourceFile; //

void FormatParamString(); //

public:

explicit CFileParser(const char *FileName); // , c

bool GetStartTag(const char* TagName); //

bool GetStopTag(const char* TagName); //

bool GetTagBody(const char* TagName, char* Dest, int &DestLen); //

// :

bool GetTagParam(const char* TagName, const char* ParamName, char* Dest, int &DestLen);

fstream &PrepareWriting(); //

};

 

:

- , ;

- PrepareWriting(), fstream. . PrepareWriting() .

 

, . explicit , .

GetStartTag() <TagName >. , . , , , ().

GetStopTag() . GetStartTag(Tag) GetStopTag(Tag).

GetTagBody() Dest DestLen , c <. DestLen . ( ).

GetTagParam() Dest ( DestLen ). DestLen . ( ).

GetTagParam() FormatParamString(), .

PrepareWriting() , . fstream, . , .

 

.

1. : CFileParser.h, CFileParser.cpp.

2. : , , .

3. , : ( ); ( ).

.

1. , . , . .

 

4. : CField

, , CField. .. , CField CSimpList.

CField :

- ;

- ;

- ;

- ;

- : , , .

 

CField:

#define vtAuto vtNone; // vtNone (. VarType CVariant.h - variant type)

class CField: public CSimpList

{ CField* GetByOffsetIndex(int OffsetIndex) // , OffsetIndex

{ if(!OffsetIndex) return this;

if(!next) return NULL;

return static_cast<CField*>(next)->GetByOffsetIndex(OffsetIndex-1);

}

public:

VarType FieldType; // vtAuto (.. vtNone) ,

char FieldName[32]; //

static unsigned int AutoNextVal; //

int OutputOrder; //

int FieldLen; // ( )

bool Visible; //

int GetIndexByOrder(int OrderNum); //

bool SetNewOrd(int OldOrd, int NewOrd); // OldOrd NewOrd

CField* operator[](int index) //

{ return static_cast<CField*>(First())->GetByOffsetIndex(index);

};

bool LoadFromFile(CFileParser &DataFile); //

bool SaveToFile(fstream &DataFile); //

// :

bool operator==(CSimpList &List) { return true;}

bool operator< (CSimpList &List) { return false;}

bool operator> (CSimpList &List) { return false;}

virtual bool Add(CField* Elem);

virtual CField* Remove();

CField(CField *List = NULL);

~CField(void);

};

 

FieldType VarType, (CVariant). . (vtNone) , vtAuto. . . AutoNextVal, .

. CField . CField . , () (. CRecord ) .

FieldName. ( ):

- OutputOrder . , .. , (. CRecord). , ;

- FieldLen ;

- Visible () . , .

 

:

- GetIndexByOrder () ;

- SetNewOrd . , , , . . , SetNewOrd(0,2) ;

- Add, Remove . CSimpList::Add() CSimpList::Remove() .

 

:

- operator[] , ;

- GetByOffsetIndex , , . .

 

/ :

- LoadFromFile ;

- SaveToFile .

 

, .. . , , , Sort() . , .. Sort() .

.

  1. : CField.h, CField.cpp.

 

.

1. . CField.

5. : CRecord

, , CRecord, .

.

CRecord CField, .. , .

CVariant, .

, , , .

, CRecord . .

CField, CRecord .

 

, . .

Sort() CSimpList , . . , , , .

, Sort() , SortCriterion. . , , .. . 4.2 CSomeList.

 

.

  1. CRecord.

6. : CSimpTable

, . CSimpList, .

 

class CSimpTable: public CSimpList

{ CField *Fields; //

// CRecord *Records; //

char TableName[32]; //

public:

CSimpTable(CSimpTable *List = NULL);

~CSimpTable(void);

// :

bool LoadFromFile(CFileParser &DataFile);

bool SaveToFile(fstream &DataFile);

// :

bool operator==(CSimpList &List) { return true;}

bool operator< (CSimpList &List) { return false;}

bool operator> (CSimpList &List) { return false;}

};

 

.

: , . , , .

 

:

#include <iostream>

#include "CFileParser.h"

#include "csimptable.h"

int _tmain(int argc, _TCHAR* argv[])

{ CSimpTable table; //

CFileParser file("infile.txt"); // ,

table.LoadFromFile(file); //

fstream& outfile=file.PrepareWriting(); //

table.SaveToFile(outfile); //

}

 

infile.txt :

<table>

testTable

<field ID=1 length=31 type=I>

fieldname1

</field>

<field ID=2>

fieldname2

</field>

<field ID=3>

fieldname3

</field>

</table>

 

. , . PrepareWriting() , ~.

 

 

.

  1. : CSimpTable.h, CSimpTable.cpp. .

 

1. XML

, .

(Standardized Generalized Markup Language - SGML), , . (HyperText Markup Language HTML), . , HTML , .. , . , HTML HTML- ( ), .. -.

SGML (eXtensible Markup Language - XML), (W3C World Wide Web Consortium, [. 2]). XML HTML, , .. (schema). , XML[1][1].

XML [. 1]. XML, [. 3], [. 4].

XML-:

<?xml version="1.0"?><message><to>A.B.C.</to><toaddress>[email protected]</toaddress><from>D.E.F.</from><fromaddress>[email protected]</fromaddress><subj>:)</subj><body>:) LOL</body></message>

(instance) , .. . , , <message>, <to> .., .

 

 


 





:


: 2016-10-30; !; : 266 |


:

:

, ,
==> ...

1699 - | 1622 -


© 2015-2024 lektsii.org - -

: 0.542 .