使用 Visual C++ 进行 C++ Xerces 教程






1.76/5 (9投票s)
使用 Xerces for C++ 创建一个空的 DOM 文档。
引言
本文将介绍如何使用 Xerces for C++ 和 Visual Studio 9 来创建一个空的 XML DOM 文档。虽然我没有包含此应用程序的实际输出,但如果包含的话,它将生成一个如下所示的 XML 文档。
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Hello_World/>
我写了另一篇教程,介绍了如何输出到文件系统或输出流:Xerces for C++ 使用 Visual C++ 第二部分。
背景
我写这篇文章的主要原因是 Xerces 的官方文档中示例代码很少。此外,我找不到其他人在 Visual Studio 2008 (v9) 上使用 Xerces for C++。
Subversion 源代码控制存储库 (可选)
(提及 Subversion 源代码控制是可选的 - 如果您不感兴趣,可以忽略。)
我为 Win32 平台编写计算机软件。我主要使用微软的 Visual Studio 产品。过去,我使用 Microsoft Visual Source Safe ("VSS") 作为我的源代码存储库;但是,我现在正在使用一个名为 Subversion 的开源替代品。我研究过几个高端源代码控制存储库;然而,在我看来,Subversion 应该能满足几乎所有开发团队的需求。刚开始可能会有点吓人(尤其是如果您习惯使用 VSS);但与 TortoiseSVN 客户端结合使用时,它真的非常容易。话虽如此,我还是强烈建议您也修改您使用源代码控制的方式。如果只是像 VSS 一样使用 Subversion,那么升级到 Subversion 就没有多大意义了。我不使用命令行界面来使用 Subversion(而且我永远也不想这样做)。
设置您的 Visual Studio 9 环境 (使用 Subversion)
(提及 Subversion 源代码控制是可选的 - 如果您不感兴趣,可以忽略。)
以下是我个人对硬盘布局文件和文件夹的偏好,以及它如何与 Subversion 源代码控制集成。请看下面我的 Explorer 屏幕截图(图标已被 TortoiseSVN 修改,但暂时忽略它们)。
我将代码分为三个主要区域:
- 我正在进行的项目。在此例中,为 Xerces_Lesson_01。
- 来自其他组织的代码,例如 Xerces (来自 Apache 项目)。
- ...以及一个名为 externals 的特殊文件夹。
主项目 (Xerces_Lesson_01) 分为分支、标签和主干。这是 Subversion 源代码控制推荐的方案,我发现它非常有帮助。主干中的代码始终可以编译,并且**永远**不会出错——它被认为是我的当前工作副本。每当我需要“破坏”代码进行重构、修复 bug 或进行实验时,我都会“分支”出一个单独的文件夹,进行更改,然后合并回主干。发布版本会被“打上标签”并适当地移动。
如果一个项目由多个项目或库组成(我自己的或第三方库),我也会将它们纳入源代码控制。在上例中,第三方库是 xerces-c_2_7_0-windows_2000-msvc_60。
externals 文件夹带有特殊属性(感谢 TortoiseSVN),可以将文件从一个位置复制到另一个位置。在上图所示的图表中,已复制到新位置的文件以红色着色。请注意,这些文件不仅复制到 Xerces_Lesson_01,而且还会以我指定的正确修订号复制。通过这种方式,在开发我的项目时,我可以回溯到我的主项目的任何先前修订版本,同时也能获取该修订版本的所有依赖项。这是一种非常强大的技术,可以让我自信地推进项目,尽管有多个可能随时间变化的依赖项。
将其他项目的依赖项拉入 externals 文件夹的另一个原因是,将所有编译器和链接器选项严格地纳入源代码控制(请参阅下一节)。
设置 Visual Studio 9 与 Xerces
在编译、链接和运行可执行文件之前,有三件事情需要设置:
- 告诉 Visual Studio (和/或项目) 在哪里可以找到包含文件 (*.h)
- 告诉 Visual Studio (和/或项目) 在哪里可以找到库文件 (*.lib)
- 将动态链接库 (*.dll) 复制到与可执行文件相同的目录 (以及/或调试期间复制到解决方案目录)
假设您已经下载了 Xerces 二进制文件(包含包含文件、库和 DLL),您可以通过多种方式引用 Xerces。也许最常用的方法是使用 VC++ 目录选项引用各种文件(如下所示)。
- 优点
- 快速、简单、易于使用。
- 缺点
- 这些值与 Visual Studio 的特定实例相关联,而不是与您正在处理的项目相关联。如果您将项目文件复制到另一台 PC,则必须在新的 PC 上重新建立这些目录。
- 这些值不容易与源代码控制解决方案关联(因为它们不与项目关联)。
- 如果您有多个开发人员处理相同的项目,并且其中一个更改了此处的值,更改不会自动传播到其他开发人员的 PC。
如上列表所示,缺点多于优点;因此,在您与其他开发人员一起处理代码的商业环境中,我不推荐此方法。考虑改用以下方法:
虽然在此处添加完整路径是完全可能的,但我通常不这样做,而是提供相对路径。总的来说,我尽量避免使用绝对路径。这使得我更容易将整个项目及其所有依赖项复制到内存棒上,并在另一台 PC 上继续开发,而无需更改任何内容。这使得备份也更容易。
链接 Xerces 库
Using the Code
我假设您已经下载并安装了 Xerces for C++ (Win32 平台) 的二进制文件。在使用下面的示例代码之前,您需要告诉 Visual Studio Xerces 包含文件和库文件的位置。您还需要将 Xerces DLL 放置在解决方案目录中(或与可执行文件相同的位置)。
// Mandatory for using any feature of Xerces.
#include <xercesc/util/PlatformUtils.hpp>
// DOM (if you want SAX, then that's a different include)
#include <xercesc/dom/DOM.hpp>
// Define namespace symbols (Otherwise we'd have to prefix Xerces code with
// "XERCES_CPP_NAMESPACE::")
XERCES_CPP_NAMESPACE_USE
int main(void) {
// Initilize Xerces.
XMLPlatformUtils::Initialize();
// Pointer to our DOMImplementation.
DOMImplementation* p_DOMImplementation = NULL;
// Get the DOM Implementation (used for creating DOMDocuments).
// Also see: http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html
p_DOMImplementation = DOMImplementationRegistry::getDOMImplementation(
XMLString::transcode("core"));
// Pointer to our DOMDocument.
DOMDocument* p_DOMDocument = NULL;
/*
Create an empty DOMDocument. When an empty document is created specify the
namespace of the document (optional)
and also the root node. Both of these values can be any valid text
(ie. no spaces or weird characters).
The "root node" in this example is "Hello_World". (XML is case-sensitive)
This root node *owns everything* beneath it, just as if it were a separate
object... in fact, it is. It's defined
by the 'DOMNode' class.
*/
p_DOMDocument = p_DOMImplementation->createDocument(0, L"Hello_World", 0);
/*
The output of the code above will produce the following:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<Hello_World/>
*/
// Cleanup.
p_DOMDocument->release();
XMLPlatformUtils::Terminate();
return 0;
}
如果您收到以下错误
error LNK2001: unresolved external symbol
"__declspec(dllimport) public: static wchar_t *
__cdecl xercesc_2_7::XMLString::transcode(char const * const)" (
__imp_?transcode@XMLString@xercesc_2_7@@SAPA_WQBD@Z)
修改以下 C++ 语言编译器选项
/Zc:wchar_t (wchar_t Is Native Type)
历史
- 首次发布:2008-11-20。
- 更新:2008-11-29。
- 更新:2009-01-26 - 小修。