CMarkupArchive,CMarkup 的扩展





4.00/5 (7投票s)
2002 年 5 月 27 日
3分钟阅读

379882

1577
此类为 XML 解析器 CMarkup 增加了额外功能:文件处理、命名空间、数值助手和新的查找方法。
CMarkup
是一个强大的 XML 解析器,发布在 CodeProject 上(请参阅文章 此处)。它快速且直观。在这里,我介绍了一个 CMarkup
的派生类,名为 CMarkupArchive
,它增加了更多功能。您可以从免费的 CMarkup Lite(可在 https://codeproject.org.cn/soap/markupclass.asp 找到)或 CMarkup Evaluation(可在 www.firstobject.com 找到,其中解释了许可选项)派生它。所有添加的功能都封装在 CMarkupArchive
的代码中,并且 CMarkup
保持不变。此扩展的主要功能是
- 支持带压缩的文件处理(使用 zlib)用于加载/存储数据,
-
CArchive
风格,摆脱您旧的Serialize
函数,改用 XML! - 新的查找方法:
Find(Child)ElemAttrib
,查找一个匹配标签且包含一个属性匹配所需值的元素, - 添加和获取助手函数:添加/获取数值而无需担心字符串转换!所有经典类型都支持:
bool
,int
,UINT
,double,
,std::vector
,std::list
和std::valarray
。 - 查找和获取助手函数:查找一个标签,并在需要时加载数值。
- 命名空间支持:自动为标签附加命名空间。
本文档不包含任何演示,仅包含源代码。要获取演示,请尝试 CMarkup 文章附带的演示:CMarkup
文章。
文件处理和 CArchive
风格
CMarkupArchive
将为您处理文件操作的繁琐工作。只需指定文件名,打开它,您就可以开始解析了。
// CMarkupArchive is in the markup namespace using namespace markup; CMarkupArchive xml( /* flags */ ArchiveModeNotZipped /* Disabling zipping */ | ArchiveModeStoring /* Storing mode*/); // Try to open file for writing if ( xml.Open(_T("myXMLfile.xml")) { // file succesfully opened, insert parsing code // closing xml.Close(); }
它使用 zlib 进行代码内的 XML 压缩和解压缩。但是,您可以使用相应的标志禁用此选项(参见上文)。存档的状态可以通过经典的函数检索,例如 IsStoring
、IsLoading
和 IsOpen
。
新的查找方法
bool FindElemAttrib( LPCTSTR szName, LPCTSTR szAttrib, LPCTSTR szAttribValue ); bool FindChildElemAttrib( LPCTSTR szName , LPCTSTR szAttrib, LPCTSTR szAttribValue );
使用此方法,您可以找到一个匹配 szName
的(子)元素,该元素包含一个属性 szAttrib
且其值匹配 szAttribValue
。
以下是典型的应用示例。考虑以下 XML 片段
<employe name="Jack"> ... </employe> <employe name="Bill"> ... </employe>
查找名为 Bill 的员工姓名轻而易举。
if( xml.FindChildElemAttrib( _T("employe") , _T("name"), _T("Bill") )) { // found employe Bill }
数值助手
停止为数值转换为字符串或反之而烦恼。提供了一整套助手函数。
存储数据
bool AddElemEx(LPCTSTR szName, Type _Type ); bool AddChildElemEx(LPCTSTR szName, Type _Type ); bool AddAttribEx(LPCTSTR szName, bool _Type); bool AddChildAttribEx(LPCTSTR szName, bool _Type);
其中 type
是以下之一:bool
、int
、UINT
、DWORD
、float
、double
、std::vector<double-float-int-BYTE>
、std::list<double-float-int-BYTE>
、std::valarray<double-float-int-BYTE>
。它们使用 CMarkup
的 Add(...)
。
典型的例子是
bool correct; double value; ... xml.AddChildElemEx(_T("Corret"), correct); xml.AddChildAttribEx(_T("Value"), value);
加载数据
要加载数据,请使用以下方法:
Type GetData[Type](); Type GetChildData[Type](); Type GetAttribData[Type](LPCTSTR szAttrib); Type GetChildAttribData[Type](LPCTSTR szAttrib);
这些函数是存储助手函数的反函数,并使用 CMarkup
的 Get(...)Data
。
其他专用函数执行以下操作:查找元素并根据需要获取数据。
bool FindGetData(LPCTSTR szName, Type& _Type); bool FindGetChildData(LPCTSTR szName, Type& _Type);
典型用法如下:
bool correct; double value; ... xml.FindGetElem(_T("Corret"), correct); xml.FindGetChildElem(_T("Value"), value);
命名空间处理
您可以通过使用以下(不言自明的)函数自动为您的标签添加命名空间:
bool SetNameSpace(LPCTSTR szNameSpace); CString GetNameSpace() const;
以下代码片段
... xml.SetNameSpace(_T("myNameSpace")); ... xml.AddChildElem(_T("element"), _T("..."));
将输出
<myNameSpace:element> ... </myNameSpace:element>
编码字符串
您可以修改 xml 编码字符串:保存到文件或字符串时,会添加以下行:
<?xml version="1.0" encoding="ISO-8859-1" ?>可以使用
SetEncodingString
修改 ISO-8859-1 的值。将 CMarkupArchive
集成到您现有的项目中
CMarkupArchive
继承自 CMarkup
,因此您可以在使用 CMarkup
的任何项目中将其用作,即使您使用的不是 Lite 版本!源代码以静态库的形式提供。以下是安装步骤:
-
将您的
CMarkup
版本复制到 XMLMarkup 目录中, -
将它们集成到静态库项目中,
-
将
CMarkup
的声明和实现封装在markup
命名空间中, -
在
CMarkup
声明中将以下函数声明为virtual
(命名空间处理需要):virtual bool AddElem( LPCTSTR szName, LPCTSTR szData=NULL); virtual bool AddChildElem( LPCTSTR szName, LPCTSTR szData=NULL); virtual bool FindElem( LPCTSTR szName=NULL); virtual bool FindChildElem( LPCTSTR szName=NULL);
-
重新编译静态库。它应该会生成一个 XMLParser(d,u,ud).lib 文件(分别对应 release、debug、UNICODE debug 和 UNICODE release),
-
在您的项目中需要的地方包含 MarkupArchive.h。由于它是作为静态库提供的,因此头文件将自动告诉链接器查找 .lib 文件(确保它们在路径中)。
-
解析,然后再次解析。
更新历史
10-14-2002
- 修复了尝试打开不存在的文件时的错误
- 添加了 STL2String 模板以处理字符串到 STL 和 STL 到字符串的转换
- 修复了一些关于命名空间的错误
10-10-2002
- Albert van Peppen 的大量贡献,
- 将
Add(Child)(Attrib-Elem)[Type]
更改为Add(Child)(Attrib-Elem)Ex
,更好、更简单,AVP, - 添加了 list 和 valarray 支持,
- 修复了
Find(Child)ElemAttrib
中的错误 - 将 EArchive 枚举移到类中 - 添加了命名空间标记