📄 xml.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 + -