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

在 C/C++ 程序中解析 XML 文件

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.59/5 (15投票s)

2011 年 4 月 2 日

CPOL

3分钟阅读

viewsIcon

181789

downloadIcon

11166

一个基于 DOM 的 XML 解析器,使用 C/C++。

引言

我经常使用 CodeProject 的文章和代码示例作为编程相关主题的信息来源。也许,现在是分享一些知识和经验的时候了。如今,有如此多相对接近的技术,选择正确的方法来解决编码问题并找到有效的解决方案并非易事 - 从正确选择平台和编程语言,到几乎任何编程任务都可以实现的多种变体。CodeProject 模型的最好和独特之处在于,程序员撰写的关于给定主题的文章(不仅仅是像 MSDN 中那样关于 Microsoft 技术的文章)附带有给定编程语言的代码示例。因此,以下带有代码示例(控制台应用程序)的文章应该可以帮助您在需要处理大量结构化信息时提供帮助。当然,稍微修改以适应您的需求,这段代码可以用在您的 C/C++ 项目中,从 XML 文件中读取和处理大量结构化数据。

背景

有很多方法可以读取大量数据并在您的程序中处理它。例如,您可以使用 SQL 从数据库中读取结构化信息。您可以使用编程技术和给定的语言函数来读取 Excel 或 CSV 文件中的数据。在所有这些情况下,您都必须编写自己的代码来处理(解析)数据,这在大多数情况下可能是一种低效且容易出错的解决方案。文档对象模型 (DOM) 提供了一种标准化的方式来读取和解析从 XML 文件读取的结构化数据。这是“一个平台和语言中立的接口,允许程序和脚本动态地访问和更新文档的内容、结构和样式” - (www.w3.org/DOM/)。

使用代码

DOM 提供标准 API,通过遍历解析器创建的“节点”树来访问 XML 文档的对象。MSDN 说:“DOM 实现是 MSXML 解析器的一部分”(这里我们使用 Microsoft XML Core Services 或 MSXML 中的 DOM 实现),其中解析器创建文档的物理的、树状的结构,检查它是否格式良好,并在请求时进行验证。

这是代码示例中提供的 XML 文件中的元素和属性结构(这是来自 MSXML 4.0 SDK 的 stocks.xml 文件)

示例 XML 文件

MSDN, MSXML 4.0 SDK 说:“在解析文档后,可以沿任何方向浏览其节点;它们不限于直线式文本文件处理。DOMDocument 对象公开属性和方法,允许您导航、查询和修改 XML 文档的内容和结构。以下每个对象都公开方法和属性,使您可以收集有关对象实例的信息、操作对象的值和结构,以及导航到树中的其他对象。对于使用 C、C++ 的开发人员,这些对象公开为以下 COM 接口”。这是相应的代码

//Initialize COM Library:
CoInitialize(NULL);

//Create an instance of the DOMDocument object:
docPtr.CreateInstance(__uuidof(DOMDocument30));

然后加载文档(XML 文件)

_variant_t varXml(szFileName);//XML file to load
varResult = docPtr->load(varXml);

通过标签名称收集所有或选定的节点

NodeListPtr = docPtr->getElementsByTagName(strFindText);

//Output root node:
docPtr->documentElement->get_nodeName(&bstrItemText);

在 DOM 模型中,“节点可用于表示元素、属性、文本内容、注释、处理指令、实体、CDATA 部分和文档片段”。在我们的示例中,我们仅使用元素和属性。

最后,在 for 循环中,我们遍历每种类型的 element 节点,然后遍历每个元素的 attributes(如果存在)

for(i = 0; i < (NodeListPtr->length); i++)
{
    if (pIDOMNode) pIDOMNode->Release();
    NodeListPtr->get_item(i, &pIDOMNode);
    //Loop through the nodes:
    if(pIDOMNode )
    {
        pIDOMNode->get_nodeTypeString(&bstrNodeType);

        //We process only elements (nodes of "element" type): 
        BSTR temp = L"element";
        //some code here...

        //Loop through the number of attributes:
        for(j = 0; j < length; j++)
        {
            //some code here...
        }
    }
}

这是解析的输出

解析 stocks.xml 文件的输出

参考文献

历史

  • 2009 年 8 月 - 内置 Visual Studio C++ 6.0
  • 2010 年 8 月 29 日 - 在 Visual Studio C++ 2008 中重新编译
  • 2011 年 4 月 15 日 - 添加了图像并更新了文本
© . All rights reserved.