c++ 使用xerces读取XML

XML作为一种重要的文件格式,应用面非常之广。从ASP.NET的web.config,到Android的页面设计开发,Webservice通信等。有时候难免需要我们通过程序进行创建与解析,最近刚完成一个C++项目,就需要读取XML配置文件,关于XML解析器的选择很多,可以参考:http://www.metsky.com/archives/578.html

个人比较喜欢Apache的开源项目,所以使用的是:Xerces。它的使用方法,其实官方上已经有很多demo,详见:http://xerces.apache.org/xerces-c/samples-3.html。个人觉得DOMCount比较实用,下面分享一下我的个人实践。通过DOM方式读取XML中指定节点的属性及文本值。

开发环境:Visual studio 2013

下载源码就不说了,地址:http://apache.dataguru.cn//xerces/c/3/sources/xerces-c-3.1.2.zip,无法下载,可以去http://xerces.apache.org/xerces-c/download.cgi下载。

首先,编译XercesLib工程,得到xerces-c_3_1D.dll,xerces-c_3D.lib两个文件,其次需要在目标工程添加这2个文件,以及相应的头文件,然后是一点配置,接下来就是编码。

下面详细分步进行:

1.VS 2013 打开xerces-c-3.1.2\projects\Win32\VC12\xerces-all\xerces-all.sln
 

选中XercesLib->右击->编译

2.复制xerces-c-3.1.2\Build\Win32\VC12\Debug文件夹下的xerces-c_3_1D.dll,xerces-c_3D.lib文件到目标工程的编译输出目录下(有编译过一次才有),如:~\ Debug\ 下面。

3.复制xerces-c-3.1.2下的src文件夹到目标工程下。

4.配置include Directories 增加.\src,
 
配置Dependencies 增加xerces-c_3D.lib,Library Directories 增加$(OutDir)(即编译输出目录)
 
2-4步是所有调用动态库的通用配置方法,如果明白其中的原理,其实可以灵活配置。
XML文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<config>
  <child>
    <node1>
      <list name="1">test11</list>
      <list name="2">test12</list>
    </node1>
    <node2>
      <list name="1">test21</list>
      <list name="2">test31</list>
    </node2>
    <node3>
      <list name="1">test31</list>
      <list name="2">test32</list>
    </node3>
  </child>
</config>

5.开始实现编码。

5.1包含头文件

1 #include <xercesc/util/PlatformUtils.hpp>
2 #include <xercesc/dom/DOM.hpp>
3 #include <xercesc/sax/HandlerBase.hpp>
4 #include <xercesc/parsers/XercesDOMParser.hpp>

5.2初始化环境

 1 try {
 2         XMLPlatformUtils::Initialize();
 3     }
 4     catch (const XMLException& toCatch) {
 5         // Do your failure processing here
 6         return;
 7     }
 8     ///
 9     XercesDOMParser *parser = new XercesDOMParser();
10     parser->setValidationScheme(XercesDOMParser::Val_Always);
11     parser->setDoNamespaces(true);    // optional
12
13     ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
14     parser->setErrorHandler(errHandler);

5.3载入XML文件

 1 try {
 2         parser->parse(“D:\RUN.XML”);
 3     }
 4     catch (const XMLException& toCatch) {
 5         char* message = XMLString::transcode(toCatch.getMessage());
 6         cout << "Exception message is: \n"
 7             << message << "\n";
 8         XMLString::release(&message);
 9         return;
10     }
11     catch (const DOMException& toCatch) {
12         char* message = XMLString::transcode(toCatch.msg);
13         cout << "Exception message is: \n"
14             << message << "\n";
15         XMLString::release(&message);
16         return;
17     }
18     catch (...) {
19         cout << "Unexpected Exception \n";
20         return;
21     }

5.4开始解析

1 DOMDocument *doc = parser->getDocument();
2 DOMElement *root = doc->getDocumentElement();//读取根节点

5.5 找对应节点值与属性

 1 DOMNode *DN=root;
 2 DN = findchildNode(DN, "child");//查找child子节点
 3 for (DN = DN->getFirstChild(); DN != 0;DN = DN->getNextSibling())
 4     {//遍历node1,2,3子节点
 5         if (DN->getNodeType() == DOMNode::ELEMENT_NODE)//这个是必要的,因为如果不判断类型,实际上每一个节点会有一个TEXT_NODE,而且是第一个节点
 6         {
 7             if (XMLString::compareString(XMLString::transcode(findchildNode(DN, "list")->getAttributes()->getNamedItem(XMLString::transcode("name"))->getNodeValue()), XMLString::transcode("1")) == 0)
 8             {//找到<list name=”1”>的节点
 9                 cout <<”对应节点值为:” << XMLString::transcode(findchildNode(DN, " list")->getTextContent())<<endl;
10                     //DO IT CODE
11                 …
12
13             };
14
15         }
16      }
17 XMLPlatformUtils::Terminate();//释放环境

下面是findchildNode函数的代码

 1 DOMNode* findchildNode(DOMNode *n, char *nodename)
 2  {//寻找n节点下子节点名为nodename的节点
 3      try
 4      {
 5          for (DOMNode *child = n->getFirstChild(); child != 0; child = child->getNextSibling())
 6          {
 7              if (child->getNodeType() == DOMNode::ELEMENT_NODE  && XMLString::compareString(child->getNodeName(), XMLString::transcode(nodename)) == 0)
 8              {
 9                  return child;
10              }
11          }
12      }
13      catch (const XMLException& toCatch)
14      {
15          char* message = XMLString::transcode(toCatch.getMessage());
16          cout << "Exception message is: \n"
17              << message << "\n";
18          XMLString::release(&message);
19      }
20      return 0;
21  }

5.6 记得释放环境

XMLPlatformUtils::Terminate();

1.输出结果为

对应节点值为:test11

总结:

读取XML有两种模式,一种是基于事件的SAX方式,一种是DOM,本文采用DOM方式,其实与js中的getElementbyId()有些类似。代码主体是完整的,希望不影响理解。如有需要源代码的,可加QQ或微信:304772487或来信:[email protected]

时间: 2024-08-05 09:01:43

c++ 使用xerces读取XML的相关文章

android XMLPullParser读取xml文件

由于刚学Android,用的开发工具是Android studio,没用过eclipse的那个开发Android,所以针对有些说由于2个IDE的路径不通导致的文件读取不到,不做分析(实际上是没法分析eclipse里的),这个博文只针对AS用户. 我们的资源文件,除了放到res目录下之外,还可以放在跟java .res同级的asserts(新建的)目录里. 今天要解析的这个xml就是在这个目录下的. 首先说一下xmlpullparser,这个pull解析是基于事件的模式.比如 读取到xml的开始声

C#读取XML文件的基类实现

刚到新单位,学习他们的源代码,代码里读写系统配置文件的XML代码比较老套,直接写在一个系统配置类里,没有进行类的拆分,造成类很庞大,同时,操作XML的读写操作都是使用SetAttribute和node.Attribute(name)方法,因此,想到结合之前所做的XML操作,完成了一个能够读取XML文件的基类,便于以后的使用. PS:即使再老套的代码,目前也不敢进行优化,一是水平不行,二是不敢. 使用静态扩展类,扩展了几个经常使用的类型,能够方便数据的读写. 操作XML的类,可以直接继承BaseL

【XML配置文件读取】使用jdom读取XML配置文件信息

在项目中我们经常需要将配置信息写在配置文件中,而XML配置文件是常用的格式. 下面将介绍如何通过jdom来读取xml配置文件信息. 配置文件信息 <?xml version="1.0" encoding="UTF-8"?> <config> <base-config> <stringValue>Hello world</stringValue> <integerValue>8</integ

C#中使用XML指南之读取XML

? C#中使用XML指南之读取XML ? 访问的两种模型: ? 在程序中访问进而操作XML文件一般有两种模型,分别是使用DOM(文档对象模型)和流模型,使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据,可以使用XPath查询,但是,DOM的缺点在于它需要一次性的加载整个文档到内存中,对于大型的文档,这会造成资源问题.流模型很好的解决了这个问题,因为它对XML文件的访问采用的是流的概念,也就是说,任何时候在内存中只有当前节点,但它也有它的不足,它是只读的,仅向前的,不能在文

用C#读取XML文档

本文将以一个非常简单的例子来说明如何使用C#访问一个XML文件并且读取其中的信息.例子本身并无任何实际意义,它只是简单的介绍了如何调用微软的XML标准以及如何运用到实际当中去.希望能够对初次接触C#或者未尝试过通过C#读取XML文件的读者有所启发.本文旨在抛砖引玉,希望能与更多的朋友交流和分享经验.    制作过程 1. 运行Visual Studio.NET,新建Visual C#.NET工程,这里取名为ReadXML. 2. 在解决方案资源管理器中,将Form1.cs改名为frmAuthor

读取xml并将节点保存到Excal

using NPOI.HPSF; using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using Sy

Excel开发学习笔记:读取xml文件及csv文件

读取xml文件 有好多种读取xml的方式,xmlDOM比较常见,我使用了另外一种,它以数据流的方式打开文件并读取内容 Imports System.Xml  Dim group As New List(Of String)  Using reader As XmlReader = XmlReader.Create(OpenFileDialog2.FileName)      While reader.ReadToFollowing("group")          reader.Mo

C# 递归读取XML菜单数据

在博客园注册了有4年了,很遗憾至今仍未发表过博客,趁周末有空发表第一篇博客.小生不才,在此献丑了! 最近在研究一些关于C#的一些技术,纵观之前的开发项目的经验,做系统时显示系统菜单的功能总是喜欢把数据写在数据库表,然后直接读取加载到菜单树上显示. 现在想把菜单数据都放在XML里,然后递归读取XML. 由于项目使用WCF,实体类使用了两个,一个是业务逻辑层中的实体,一个是调用业务逻辑层递归方法后进行数据实体的转换,XML读取方法写在业务逻辑层中. 思路:1.先读取XML里所有的菜单    2.根据

android 读取xml

在有些应用中,有一点小数据,直接存储在XML就是,实现较为简单, 1.xml文件放入asset文件夹,结构如: <?xml version="1.0" encoding="UTF-8" ?> <messages><message id="1"><title>3月毕业证数码像采集</title><date1>3</date1><content>3月12日