⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xml.cpp

📁 功能齐全的XML解析/生成类. 可以在Windows/WindowsCE下使用.亲自调试通过.
💻 CPP
📖 第 1 页 / 共 5 页
字号:
			if (TargetMode == 2)
				; // Nothing :)
			else
				if (TargetMode == 3)
					fwrite(L">",1,1,fp);
				else
					fprintf(fp,">",b.operator char*());
			}
		}


	if (ShowAll)
		{
		for(int i = 0 ; i < iC ; i++)
		 {
		 if (TotalComments && (NextComment < TotalComments))
			 {
			 while ((NextComment < TotalComments) && root->GetComments()[NextComment]->GetEP() <= i)
				 {
				 // print that comment now
				 char* t = root->GetComments()[NextComment]->operator char *();
				 Z<char> b(strlen(t) + deep + 200);
				 for(int i = 0 ; i < (deep + 1) ; i++)
					 //				  strcat(b,"\t");
					 strcat(b,DelimiterChar);
				 strcat(b,"<!--");
				 strcat(b,t);
				 strcat(b,"-->\r\n");

				 if (TargetMode == 1)
					 {
					 spi = sprintf(sp,"%s",b.operator char*());
					 sp += spi;
					 }
				 else
					 if (TargetMode == 2)
						 {
#ifdef _WIN32
#ifndef WINCE
						 // Create a comment
						 Z<char> VName(20);
						 sprintf(VName,"C%u",NextComment);
						 RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
						 }
					 else
						 if (TargetMode == 3)
							 Write16String(fp,b.operator char*());
						 else // 0
							 fprintf(fp,"%s",b.operator char*());

				 NextComment++;
				 }
			 }

		 if (TotalContents && (NextContent < TotalContents))
			 {
			 while ((NextContent < TotalContents) && root->GetContents()[NextContent]->GetEP() <= i)
				 {
				 // print that content now
				 //char* t = root->GetContents()[NextContent]->operator char *();
				 size_t vx = root->GetContents()[NextContent]->GetValue(0);

				 Z<char> b(vx + deep + 200);
				 if (root->xfformat.ElementsNoBreak == false)
					 {
					 for(int i = 0 ; i < (deep + 1) ; i++)
						 //strcat(b,"\t");
						 strcat(b,DelimiterChar);
					 //strcat(b,t);
					 }
				 root->GetContents()[NextContent]->GetValue(b.operator char*() + strlen(b),SaveMode);
				 if (root->xfformat.ElementsNoBreak == false)
					 strcat(b,"\r\n");

				 if (TargetMode == 1)
					 {
					 spi = sprintf(sp,"%s",b.operator char*());
					 sp += spi;
					 }
				 else
					 if (TargetMode == 2)
						 {
#ifdef _WIN32
#ifndef WINCE
						 // Create a content
						 Z<char> VName(20);
						 sprintf(VName,"D%u",NextContent);
						 root->GetContents()[NextContent]->GetValue(b,SaveMode);
						 RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)b.operator char *(),(int)(strlen(b) + 1));
#endif
#endif
						 }
					 else
						 if (TargetMode == 3)
							 Write16String(fp,b.operator char*());
						 else // 0
							 fprintf(fp,"%s",b.operator char*());

				 NextContent++;
				 }
			 if (TotalCDatas && (NextCData < TotalCDatas))
				 {
				 while ((NextCData < TotalCDatas) && root->GetCDatas()[NextCData]->GetEP() <= i)
					 {
					 // print that CData now
					 char* t = root->GetCDatas()[NextCData]->operator char *();
					 Z<char> b(strlen(t) + deep + 200);
					 for(int i = 0 ; i < (deep + 1) ; i++)
						 //				  strcat(b,"\t");
						 strcat(b,DelimiterChar);
					 strcat(b,"<![CDATA[");
					 strcat(b,t);
					 strcat(b,"]]>\r\n");

					 if (TargetMode == 1)
						 {
						 spi = sprintf(sp,"%s",b.operator char*());
						 sp += spi;
						 }
					 else
						 if (TargetMode == 2)
							 {
#ifdef _WIN32
#ifndef WINCE
							 // Create a cdata
							 Z<char> VName(20);
							 sprintf(VName,"D%u",NextCData);
							 RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
							 }
						 else
							 if (TargetMode == 3)
								 Write16String(fp,b.operator char*());
							 else // 0
								 fprintf(fp,"%s",b.operator char*());

					 NextCData++;
					 }
				 }
			 }


#ifdef _WIN32
		 if (TargetMode == 2)
			 printc((FILE*)pKey2,root->GetChildren()[i],deep + 1,ShowAll,SaveMode,TargetMode);
		 else
#endif		 	
			 {
			 printc(fp,root->GetChildren()[i],deep + 1,ShowAll,SaveMode,TargetMode);
			 if (TargetMode == 1)
				 sp = (char*)fp + strlen((char*)fp);
			 }
		 }
		}

	// Check if there are still comments
	if (TotalComments && (NextComment < TotalComments))
		{
		while (NextComment < TotalComments)
		 {
		 // print that comment now
		 char* t = root->GetComments()[NextComment]->operator char *();
		 Z<char> b(strlen(t) + deep + 200);
		 for(int i = 0 ; i < (deep + 1) ; i++)
			 //strcat(b,"\t");
			 strcat(b,DelimiterChar);
		 strcat(b,"<!--");
		 strcat(b,t);
		 strcat(b,"-->\r\n");

		 if (TargetMode == 1)
			 {
			 spi = sprintf(sp,"%s",b.operator char*());
			 sp += spi;
			 }
		 else
			 if (TargetMode == 2)
				 {
#ifdef _WIN32
#ifndef WINCE
				 // Create a comment
				 Z<char> VName(20);
				 sprintf(VName,"C%u",NextComment);
				 RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
				 }
			 else
				 if (TargetMode == 3)
					 Write16String(fp,b.operator char*());
				 else // 0
					 fprintf(fp,"%s",b.operator char*());

		 NextComment++;
		 }
		}

	// Check if there are still cdatas
	if (TotalCDatas && (NextCData < TotalCDatas))
		{
		while (NextCData < TotalCDatas)
		 {
		 // print that CData now
		 char* t = root->GetCDatas()[NextCData]->operator char *();
		 size_t ix = strlen(t);
		 Z<char> b(strlen(t) + deep + 200);
		 for(int i = 0 ; i < (deep + 1) ; i++)
			 //strcat(b,"\t");
			 strcat(b,DelimiterChar);
		 strcat(b,"<![CDATA[");
		 strcat(b,t);
		 strcat(b,"]]>\r\n");

		 if (TargetMode == 1)
			 {
			 spi = sprintf(sp,"%s",b.operator char*());
			 sp += spi;
			 }
		 else
			 if (TargetMode == 2)
				 {
#ifdef _WIN32
#ifndef WINCE
				 // Create a cdata
				 Z<char> VName(20);
				 sprintf(VName,"D%u",NextCData);
				 RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)t,(int)(strlen(t) + 1));
#endif
#endif
				 }
			 else
				 if (TargetMode == 3)
					 Write16String(fp,b.operator char*());
				 else // 0
					 fprintf(fp,"%s",b.operator char*());

		 NextCData++;
		 }
		}


	// Check if there are still Contents
	if (TotalContents && (NextContent < TotalContents))
		{
		while (NextContent < TotalContents)
		 {
		 // print that content now
		 //char* t = root->GetContents()[NextContent]->operator char *();
		 size_t vx = root->GetContents()[NextContent]->GetValue(0);

		 Z<char> b(vx + deep + 200);
		 if (root->xfformat.ElementsNoBreak == false)
			 {
			 for(int i = 0 ; i < (deep + 1) ; i++)
				 //strcat(b,"\t");
				 strcat(b,DelimiterChar);
			 }
		 //strcat(b,t);
		 root->GetContents()[NextContent]->GetValue(b.operator char*() + strlen(b),SaveMode);
		 if (root->xfformat.ElementsNoBreak == false)
			 strcat(b,"\r\n");

		 if (TargetMode == 1)
			 {
			 spi = sprintf(sp,"%s",b.operator char*());
			 sp += spi;
			 }
		 else
			 if (TargetMode == 2)
				 {
#ifdef _WIN32
#ifndef WINCE
				 // Create a content
				 Z<char> VName(20);
				 sprintf(VName,"D%u",NextContent);
				 root->GetContents()[NextContent]->GetValue(b,SaveMode);
				 RegSetValueExA(pKey2,VName,0,REG_SZ,(const BYTE*)b.operator char *(),(int)(strlen(b) + 1));
#endif
#endif
				 }
			 else
				 if (TargetMode == 3)
					 Write16String(fp,b.operator char*());
				 else // 0
					 fprintf(fp,"%s",b.operator char*());

		 NextContent++;
		 }
		}

	// ending
	strcpy(b,"");
	if (root->xfformat.ElementsNoBreak == false || iC || TotalCDatas || TotalComments || TotalContents != 1)
		{
		for(int i = 0 ; i < deep ; i++)
			//strcat(b,"\t");
			strcat(b,DelimiterChar);
		}
	strcat(b,"</");
	root->GetElementName(b.operator char*() + strlen(b));
	strcat(b,">\r\n");

	if (TargetMode == 1)
		{
		spi = sprintf(sp,"%s",b.operator char*());
		sp += spi;
		}
	else
		if (TargetMode == 2)
			{
			// Nothing
#ifdef _WIN32
			RegCloseKey(pKey2);
#endif
			}
		else
			if (TargetMode == 3)
				Write16String(fp,b.operator char*());
			else // 0
				fprintf(fp,"%s",b.operator char*());
	}

void XMLElement :: SetExportFormatting(XMLEXPORTFORMAT* xf)
	{
	if (xf)
		memcpy(&xfformat,xf,sizeof(XMLEXPORTFORMAT));
	if (xfformat.nId > 50)
		xfformat.nId = 50;
	for(unsigned int i = 0 ; i < GetChildrenNum() ; i++)
		GetChildren()[i]->SetExportFormatting(xf);
	}

void XMLElement :: Export(FILE* fp,int ShowAll,XML_SAVE_MODE SaveMode,XML_TARGET_MODE TargetMode,XMLHeader* hdr,class XMLTransform* eclass,class XMLTransformData* edata)
	{
	// Export this element
	ReloadAllElements();
	if (eclass == 0)
		{
		if (hdr)
			hdr->Export(fp,0,TargetMode,eclass,edata);
		printc(fp,this,0,ShowAll,SaveMode,TargetMode);
		if (hdr)
			hdr->Export(fp,1,TargetMode,eclass,edata);
		}
	else
		{
		//* save to another fp, then encrypt with eclass to this fp
		size_t S = MemoryUsage();
		Z<char> ram(S);
		XML_TARGET_MODE NewTargetMode = XML_TARGET_MODE_MEMORY;
		if (hdr)
			hdr->Export((FILE*)ram.operator char *(),0,NewTargetMode,eclass,edata);
		printc((FILE*)ram.operator char *(),this,0,ShowAll,SaveMode,NewTargetMode);
		if (hdr)
			hdr->Export((FILE*)ram.operator char *(),1,NewTargetMode,eclass,edata);


		Z<char> yy(S + 100);

		// convert
		//eclass->Prepare(edata);
		S = strlen(ram);
		size_t nS = eclass->Encrypt(ram.operator char *(),S,0,yy.operator char *(),S + 100,0);

		// Write
		if (TargetMode == 0)
			fwrite(yy.operator char* (),1,nS,fp);
		else
			if (TargetMode == 1)
				memcpy((char*)fp,yy.operator char *(),nS);


		/*      char* tf = ".\\a.tmp";
		FILE* fpn = fopen(tf,"wb");
		if (!fpn)
		return;

		// save
		if (hdr)
		hdr->Export(fp,0,TargetMode,eclass,edata);
		printc(fpn,this,0,ShowAll,SaveMode,TargetMode);
		if (hdr)
		hdr->Export(fp,1,TargetMode,eclass,edata);

		int S = ftell(fpn);
		fclose(fpn);

		// read a.tmp again
		Z<char>* y = XML :: ReadToZ(tf);
		XML :: Kill(tf);

		Z<char> yy(S + 100);

		// convert
		eclass->Prepare(edata);
		int nS = eclass->Encrypt((*y).operator char *(),S,0,yy.operator char *(),S + 100,0);

		fwrite(yy.operator char* (),1,nS,fp);
		delete y;
		*/
		}
	}


int _USERENTRY  XMLElementfcmp(const void * a, const void * b)
	{
	XMLElement* x1 = *(XMLElement**)a;
	XMLElement* x2 = *(XMLElement**)b;

	// compare names
	size_t z1 = x1->GetElementName(0);
	size_t z2 = x2->GetElementName(0);

	Z<char> s1(z1 + 10);
	Z<char> s2(z2 + 10);
	x1->GetElementName(s1);
	x2->GetElementName(s2);

	return strcmpi(s1,s2);
	}

int _USERENTRY  XMLVariablefcmp(const void * a, const void * b)
	{
	XMLVariable* x1 = *(XMLVariable**)a;
	XMLVariable* x2 = *(XMLVariable**)b;

	// compare names
	size_t z1 = x1->GetName(0);
	size_t z2 = x2->GetName(0);

	Z<char> s1(z1 + 10);
	Z<char> s2(z2 + 10);
	x1->GetName(s1);
	x2->GetName(s2);

	return strcmpi(s1,s2);
	}

void XMLElement :: SortElements(int (_USERENTRY *fcmp)(const void *, const void *))
	{
	// to all elements
	XMLElement** x =  GetChildren();
	int y = GetChildrenNum();
	if (!fcmp)
		qsort(x,y,sizeof(XMLElement*),XMLElementfcmp);
	else
		qsort(x,y,sizeof(XMLElement*),fcmp);
	}

void XMLElement :: SortVariables(int (_USERENTRY *fcmp)(const void *, const void *))
	{
	// to all Variables
	XMLVariable** x =  GetVariables();
	int y = GetVariableNum();
	if (!fcmp)
		qsort(x,y,sizeof(XMLVariable*),XMLVariablefcmp);
	else
		qsort(x,y,sizeof(XMLVariable*),fcmp);
	}

// Memory usage funcs
size_t XML :: MemoryUsage()
	{
	return GetRootElement()->MemoryUsage() + GetHeader()->MemoryUsage();
	}

void XML :: CompressMemory()
	{
	GetRootElement()->CompressMemory();
	GetHeader()->CompressMemory();
	}

bool XML :: IntegrityTest()
	{
	return (GetHeader()->IntegrityTest() && GetRootElement()->IntegrityTest());
	}

int XML :: Compare(XML*x)
	{
	// 2 XML = equals if headers & root elements compare ok
	int a1 = (GetRootElement()->Compare(x->GetRootElement()));
	int a2 = (GetHeader()->Compare(x->GetHeader()));
	return !(a1 == 0 && a2 == 0);
	}

size_t XMLHeader :: MemoryUsage()
	{
	size_t m = 0;

	// Our size
	m += sizeof(*this);

	// Comments
	for(unsigned int i = 0 ; i < commentsnum ; i++)
		{
		m += GetComments()[i]->MemoryUsage();
		}

	// number of comment pointers
	m += TotalCommentPointersAvailable*4;

	// Text
	if (hdr)
		m += strlen(hdr);

	return m;
	}

void XMLHeader :: CompressMemory()
	{
	// Remove wasted space by comments
	int P = commentsnum;
	if (P == 0)
		P = 1;

	XMLComment** oldp = new XMLComment*[P];
	if (commentsnum)
		memcpy(oldp,comments,commentsnum*sizeof(XMLComment*));

	TotalCommentPointersAvailable = P;
	delete[] comments;
	comments = oldp;
	}

bool XMLHeader :: IntegrityTest()
	{
	if (!hdr)
		return false;
#ifdef _WIN32
#ifndef WINCE
	if (IsBadStringPtrA(hdr,-1))
		return false;

	// Comments pointer
	if (IsBadReadPtr(comments,sizeof(XMLComment*)*commentsnum))
		return false;
#endif
#endif

	// Check comment
	for(unsigned int i = 0 ; i < commentsnum ; i++)
		{
#ifdef _WIN32
#ifndef WINCE
		if (IsBadReadPtr(GetComments()[i],sizeof(XMLComment*)))
			return false;
#endif
#endif
		if (!GetComments()[i]->IntegrityTest())
			return false;
		}
	return true;
	}

int XMLHeader :: Compare(XMLHeader* x)
	{
	// 2 Headers compare ok <=> Same text, same # comments, comments compare ok
	if (strcmp(hdr,x->hdr) != 0)
		return 1; // fail header

	unsigned int Y = GetCommentsNum();
	if (Y != x->GetCommentsNum())
		return 1;// differnet comment num

	for(unsigned int i = 0 ; i < Y ; i++)
		{
		if (GetComments()[i]->Compare(x->GetComments()[i]) == 1)
			return 1; // different comment
		}
	return 0; // OK!
	}


size_t XMLComment :: MemoryUsage()
	{
	size_t m = 0;

	// Our size
	m += sizeof(*this);

	// Comment size
	if (c)
		m += strlen(c);

	return m;
	}

void XMLComment :: CompressMemory()
	{
	}

bool XMLComment :: IntegrityTest()
	{
	// check parent,c

	if (!c)
		return false;
#ifdef _WIN32
#ifndef WINCE
	if (IsBadStringPtrA(c,-1))
		return false;
#endif
#endif

	if (parent)
		{
		// Check pointer
#ifdef _WIN32
#ifndef WINCE
		if (IsBadReadPtr(parent,sizeof(XMLElement*)))
			return false;
#endif
#endif
		}

	return true;
	}

int XMLComment :: Compare(XMLComment* x)
	{
	// Compare OK <=> Same Text
	if (strcmp(c,x->c) != 0)
		return 1;


	return 0;
	}


XMLComment* XMLComment :: Duplicate()
	{
	// returns a copy of myself
	return new XMLComment(parent,ep,c);
	}


size_t XMLContent :: MemoryUsage()
	{
	size_t m = 0;

	// Our size
	m += sizeof(*this);

	// Comment size
	if (c)
		m += strlen(c);

	return m;
	}

void XMLContent :: CompressMemory()
	{
	}

bool XMLContent :: IntegrityTest()
	{
	// check parent,c

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -