65.9K
CodeProject 正在变化。 阅读更多。
Home

CMarkupArchive,CMarkup 的扩展

starIconstarIconstarIconstarIconemptyStarIcon

4.00/5 (7投票s)

2002 年 5 月 27 日

3分钟阅读

viewsIcon

379882

downloadIcon

1577

此类为 XML 解析器 CMarkup 增加了额外功能:文件处理、命名空间、数值助手和新的查找方法。

Sample Image - markuparchive.png

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,查找一个匹配标签且包含一个属性匹配所需值的元素,
  • 添加和获取助手函数:添加/获取数值而无需担心字符串转换!所有经典类型都支持:boolintUINTdouble,std::vectorstd::liststd::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 压缩和解压缩。但是,您可以使用相应的标志禁用此选项(参见上文)。存档的状态可以通过经典的函数检索,例如 IsStoringIsLoadingIsOpen

新的查找方法

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 是以下之一:boolintUINTDWORDfloatdoublestd::vector<double-float-int-BYTE>std::list<double-float-int-BYTE>std::valarray<double-float-int-BYTE>。它们使用 CMarkupAdd(...)

典型的例子是

    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);

这些函数是存储助手函数的反函数,并使用 CMarkupGet(...)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 版本!源代码以静态库的形式提供。以下是安装步骤:

  1. 将您的 CMarkup 版本复制到 XMLMarkup 目录中,

  2. 将它们集成到静态库项目中,

  3. CMarkup 的声明和实现封装在 markup 命名空间中,

  4. 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);
  5. 重新编译静态库。它应该会生成一个 XMLParser(d,u,ud).lib 文件(分别对应 release、debug、UNICODE debug 和 UNICODE release),

  6. 在您的项目中需要的地方包含 MarkupArchive.h。由于它是作为静态库提供的,因此头文件将自动告诉链接器查找 .lib 文件(确保它们在路径中)。

  7. 解析,然后再次解析。

更新历史

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 枚举移到类中 - 添加了命名空间标记
© . All rights reserved.