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

📄 xml.h

📁 相当不错的入门程序
💻 H
字号:
#ifndef __XML__H__
#define __XML__H__
#if _MSC_VER > 1000
#pragma once
#endif
#include "coll_list.h"
#include "heap.h"

// XML节点标志(类型)
typedef enum enumXMLNODEFLAG
{	XMLNODE_SYSKEY,				// 系统节点,以?开始和结束,无子节点
	XMLNODE_ITEMKEY,			// 不包含子节点的键,格式为:<KEYNAME PAR='???'/>
	XMLNODE_KEYSET,				// 包含子节点的键,格式为:<KEYNAME PAR='???'></KEYNAME>
	XMLNODE_VALUE				// 包含的是一个值,总被包含在指定的KEYSET中
} XMLNODEFLAG;

// XML字符串
typedef struct tagXMLSTR
{	char*		m_pStr;			// 字符串内容
    BOOL		m_bSmallStr;	// 是否是小字符串(小字符串位于可用空间表中)
} XMLSTR,*LPXMLSTR;

// XML节点结构
typedef struct tagXMLNODE
{	LPVOID		m_pParent;
	LPVOID		m_pNext;
	LPVOID		m_pChild;
	XMLSTR		m_Key;
	LPVOID		m_pAttrib;
	DWORD		m_dwFlag;
	LPVOID		m_pHeapLink;
} XMLNODE,*LPXMLNODE;

// XML属性结构
typedef struct tagXMLATTRIB
{	LPVOID		m_pNext;
	XMLSTR		m_Name;
	XMLSTR		m_Value;
	LPVOID		m_pHeapLink;
} XMLATTRIB,*LPXMLATTRIB;

// XML处理类
class  CXML
{
public:
	CXML();
	virtual~CXML();
	BOOL LoadXml(const char* lpszXmlFile);
	BOOL LoadXml(const char* lpszXml,LONG nXmlLen);
	BOOL SaveXml(const char* lpszXmlFile);
	BOOL SaveXml(char* lpszXmlBuf,LONG nXmlBufLen,LONG* pnUsedOrNeeded);
	VOID FreeXml();

	// 配置读取
	INT GetXmlProfileInt(LPCSTR lpszKeyPath,INT nDefault);
	DWORD GetXmlProfileString(LPCSTR lpszKeyPath,LPCSTR lpDefault,LPSTR lpReturnedString,DWORD nSize);
	LPCSTR GetXmlProfileString(LPCSTR lpszKeyPath,LPCSTR lpDefault);
	LPCSTR GetXmlProfileSafeString(LPCSTR lpszKeyPath,LPCSTR lpDefault);

	// 配置写入
	BOOL SetXmlProfileInt(LPCSTR lpszKeyPath,INT nValue);
	BOOL SetXmlProfileString(LPCSTR lpszKeyPath,LPCSTR pszValue);

	// 路径创建和数值和属性设置
	LPXMLNODE CreateXmlWithPath(const char* lpszXmlPath,DWORD dwFlag=XMLNODE_KEYSET);
	BOOL SetXmlValueWithPath(const char* lpszXmlPath,const char* lpszValue);
	BOOL SetXmlAttribValueWithPath(const char* lpszXmlPath,const char* pszName,const char* lpszValue);
	
	// 路径查找和属性数值读取
	LPXMLNODE FindXmlWithPath(const char* lpszXmlPath,BOOL bCreate=FALSE,DWORD dwFlag=XMLNODE_KEYSET);
	const char* GetXmlValueWithPath(const char* lpszXmlPath);
	const char* GetXmlAttribValueWithPath(const char* lpszXmlPath,const char* pszName);

	// 节点枚举和查找
	const char* GetXmlNodeValue(LPXMLNODE pNode);
	LPXMLNODE FindXmlNode(LPXMLNODE pParent,const char* pszKey);
	LPXMLNODE GetFirstChildXmlNode(LPXMLNODE pParent);
	LPXMLNODE GetNextXmlNode(LPXMLNODE pNode);
	BOOL SetXmlNodeValue(LPXMLNODE pNode,const char* pszValue);

	// 属性枚举和查找
	const char* GetXmlAttribValue(LPXMLNODE pNode,const char* pszName);
	LPXMLATTRIB FindXmlAttrib(LPXMLNODE pNode,const char* pszName);
	LPXMLATTRIB GetFirstXmlAttrib(LPXMLNODE pParent);
	LPXMLATTRIB GetNextXmlAttrib(LPXMLATTRIB pAttrib);
	BOOL SetXmlAttribValue(LPXMLNODE pNode,const char* pszName,const char* pszValue);

	// 水印生成
//	BOOL GenerateWaterMark(const char* pszRoot,char* pszWaterMark,LONG nWaterMarkLen);

protected:
	// XML快速字符串
	typedef struct tagXMLSMALLSTR { BYTE m_szStr[64]; } XMLSMALLSTR;
protected:
	// XML词法分析
	BOOL ParsingXml(char* lpszXml,LONG nXmlLen);
	const char* FindXmlKeyOrAttribBegin(const char* lpszXml);
	const char* FindXmlKeyOrAttribEnd(const char* lpszXmlTokenBegin);
	const char* FindXmlAttribEqual(const char* lpszXml);
	const char* FindXmlAttribValueBegin(const char* lpszXml,BOOL& bSingleComma);
	const char* FindXmlAttribValueEnd(const char* lpszXmlAttribValue,BOOL bSingleComma);

	// 可用空间表分配和释放
	XMLSTR AllocXmlStr(const char* pszStr,LONG nSize);
	XMLSTR AllocXmlStr(LONG nSize);
	LPXMLNODE AllocXmlNodeAtTail(LPXMLNODE pParentNode);
	LPXMLATTRIB AllocXmlAttribAtTail(LPXMLNODE pParentNode);
	LPXMLNODE AllocXmlNode(LPXMLNODE pParentNode,LPXMLNODE pPrevNode);
	LPXMLATTRIB AllocXmlAttrib(LPXMLNODE pParentNode,LPXMLATTRIB pPrevAttrib);
	VOID FreeXmlStr(XMLSTR& XmlStr);
	VOID FreeXmlNode(LPXMLNODE pXmlNode);
	VOID FreeXmlAttrib(LPXMLATTRIB pXmlAttrib);

	// 文件读取回调函数
	VOID SaveXmlNodeAndChilds(LPXMLNODE pNode,FILE* fpXml,LONG nLevel);
	// 流输出回调函数
	VOID AppendXmls(char* lpszXmlBuf,LONG nXmlBufLen,LONG* pnUsed,const char* lpszAdd,LONG nAddLen);
	VOID SaveXmlNodeAndChilds(LPXMLNODE pNode,char* lpszXmlBuf,LONG nXmlBufLen,LONG* pnUsed,LONG nLevel);

	// 水印收集回调函数
//	VOID WaterMarkXmlNodeAndChilds(LPXMLNODE pNode,char** lppszBuffer,long* pnBufferSize,long* pnUsed);
protected:
	THeapList m_heapXmlNodes;		// XML节点可用空间表
	THeapList m_heapXmlAttribs;		// XML属性可用空间表
	THeapList m_heapXmlSmallStrs;	// XML小字符串表
	LPXMLNODE m_pNodeLinks;			// XML节点链表
	LPXMLNODE m_pNodeLinkLast;		// XML节点链表的最后一项(为保持和文件一致的顺序,所以添加为在最后追加)
	LPXMLATTRIB m_pAttribLinks;		// XML属性链表
	LPXMLATTRIB m_pAttribLinkLast;	// XML属性链表的最后一项(为保持和文件一致的顺序,所以添加为在最后追加)
};



#endif

⌨️ 快捷键说明

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