You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

119 lines
4.3 KiB
C++

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
原先的CXmlParse读取xml文件的方式类似深度遍历xml文档树因此本接口的使用方式类似使用堆栈来进行文档树的分析
*/
#pragma once
#include <vector>
#include <stack>
#include <list>
#include "layer.h"
#include "pugiconfig.hpp"
#include "pugixml.hpp"
class AFX_EXT_CLASS CKXmlParse //ggff20250614
{
protected:
typedef struct _xmlParseNode
{
CString str;
pugi::xml_node node;
}KXMLPARSENODE;
public:
CKXmlParse(void);
virtual ~CKXmlParse(void);
void Clear(void);
BOOL SetXmlFileBuffer(char* pBuffer,ULONG64 bufLen);
BOOL ReadXmlFile(char* filePath);
//CString ReadFileName(CFile& fr);
//读取一串XML包括关键字及其值
//分析该串XML语句如果正确将关键字保存在m_strKey中数值保存在m_valArray中
int ReadBeginSection();
int ReadEndSection();
BOOL IsIncludeValue(void);
//读取一串XML的值结束符号为空格、TAB键、回车及<(标示一新段的开始), 返回值表示是否一个新段的开始
BOOL ReadValue();
//BOOL ReadInner(CFile& fr);
//不区分大小写比较键值
BOOL IsKey(CString lpszKeyString); //与当前m_strKey值比较
BOOL IsKey(const CString& key, LPCTSTR lpszKeyString);
BOOL ParaseKeyValue(CString strKeyValue, CString& key, CString& val); //分析的字符串以=分隔KEY与VALUE
BOOL ParaseKeyValue(int nIndex, CString& key, CString& val); //分析的字符串以=分隔KEY与VALUE
int ReadRect( CRect8& rect); //读取矩形范围DML关键写及值
//已经将信息读取到了该类中,仅进行分析并形成需要的元素
int ParaseAndReadRect(CRect8& rect);
int ParaseLayer(CLayer* pLayer, void* pxy);
int ParaseFont(LOGFONT& logFont, CSize8& size);
int ParaseFont(LOGFONT& logFont, CSize8& size, COLORREF& color, int& script);
int DML_ParaseHowToViewCurve(CHowToViewCurve* phtv, void* pxy);
int DML_ParaseHowToViewPoint(CHowToViewPoint* phtp, void* pxy);
int DML_WriteMemoryBlock(CFile& fw, BYTE* lpData, DWORD nDataLength, LPCTSTR strType, int nBaseTabNum = 0);
BYTE* DML_ReadMemoryBlock(CFile& fr, DWORD& nOutDataLength, CString& strType);
int PCG_ParaseHowToViewCurve(CHowToViewCurve* phtv, void* pxy, std::vector<CString>&keys, std::vector<CString>&props);
int PCG_ParaseHowToViewPoint(CHowToViewPoint* phtp, void* pxy, std::vector<CString>&keys, std::vector<CString>&props);
int PCG_WriteMemoryBlock(CFile& fw, BYTE* lpData, DWORD nDataLength, LPCTSTR strType, const short& ver = 0, int nBaseTabNum = 0);
BYTE* PCG_ReadMemoryBlock(DWORD& nOutDataLength, CString& strType);
BOOL IsEndSection();// { return m_bOneLineEndSection; } //ggff2025
int ParaseAndReadCoordinate( CPointList& coords);
int ParaseAndReadList(); //具体数据保存在m_valArray中
BOOL CurrentNodeHasChild() { return m_bCurrendNodeHasChild; }
void InitRootNode(); //如果读到结尾,需要重新从头读,就需要设置一下
protected:
//int ReadSection(CFile& fr, BOOL bBegin); //读取一串XML其开始符号为<,结束符号为>
//int ReadValueOne(CFile& fr, BOOL *bNewSection); //读取一串XML的值结束符号为<
void ConvertCopy(char * &line,int len, char* &dest);
//int ScanfString(CStringArray &m_type, char* str, int len);
BOOL m_bIncludeValue;
void MakeStrToArr1(CString str, CStringArray &StrArr, CString splitStr);
public:
BOOL m_bOneLineEndSection; //ggff 2025 用来表示读了一条语句是否是一个完成xml语句ReadBeginSection只是读取< >中的语句,不区分是否 < > 和< /> 所以增加这个(用于区分<Title></Title> 与 <Title />这两种情况)
CString m_strKey;
std::vector<CString> m_valArray; //存放一个节点的所有属性名称
std::vector<CString> m_propValArray;// 存放一个节点的所有属性值
CString m_nodeStrValue;
CString FormatFontDML(LOGFONT& lf, CSize8& size, LPCTSTR elementName = nullptr);
CString FormatFontPCG(LOGFONT& lf, CSize8& size);
CString FormatFontPCG(LOGFONT& lf, CSize8& size, COLORREF& color, int script);
void SetDelimiter(char c) { m_cDelimiter = c; }; //ggff2025 xml文件中有时需要读取多行文本将多行文本的分隔符号设置一下。
static CString SetEscapeCharToChar(CString& str); //替换文本中转义字符 ggff2025
static CString SetCharToEscapeChar(CString& str);
protected:
char m_cDelimiter;
pugi::xml_document m_xmlDoc;
BOOL m_bHaveXml;
pugi::xml_node m_CurrentNode;
//pugi::xml_node_iterator m_CurrentNodeIt;
//pugi::xml_node m_ParentNode;
//std::stack< pugi::xml_node_iterator> m_nodeItStack;
std::list< KXMLPARSENODE> m_nodeList;
BOOL m_bUtf8;
//bool hasUtf8Bom(const std::string& filename);
//bool isUtf8Declared(const pugi::xml_document& doc);
BOOL isUtf8(CString strPathName);
BOOL m_bCurrendNodeHasChild;
};