windows下使用Xerces-C++解析XML

前景提要

最近工作中遇到收到的数据为xml格式的情况,考虑到xml解析应该是个很常用的功能,应该有开源的lib库可以使用,于是就在网上找了找,果然发现了开源库:Xerces-C++

本文目的

如题,在windows平台下使用Xerces-C++解析XML文件。

程序案例

现在有一个xml文件,要求解析出所有的节点数据给其他系统使用(本demo程序仅将数据解析到内存并打印), aaa.xml 文件如下:

 <?xml version="1.0" encoding="UTF-8"?>
<MSG>
<META>
<SNDR>FIMS</SNDR>
<RCVR/>
<SEQN>29</SEQN>
<DDTM>20150121194100</DDTM>
<TYPE>DFME</TYPE>
<STYP>AIRL</STYP>
</META>
<DFLT>
<FLID>30798</FLID>
<FFID>3U-8899-20150925-D</FFID>
<FLTK>W/Z</FLTK>
<AIRL>
<ARPT>
<APNO>1</APNO>
<APCD>CGO</APCD>
<FPTT>20150925194100</FPTT>
<FETT>20150926062203</FETT>
<FRTT/><FPLT/>
<FELT/><FRLT/>
<APAT>2403</APAT>
</ARPT>
<ARPT>
<APNO>2</APNO>
<APCD>SJW</APCD>
<FPTT/><FETT/><FRTT/>
<FPLT>20150925224100</FPLT>
<FELT/><FRLT/>
<APAT>2403</APAT>
</ARPT>
</AIRL>
</DFLT>
</MSG>

demo实现

读取aaa.xml文件,遍历每一个节点,若存在子节点则输出当前结点名称,若不存在子节点则输出当前结点名称和内容。

 //----------------------------------

 // xmltest.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include <stdlib.h>
#include <iostream> #include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
XERCES_CPP_NAMESPACE_USE using namespace std;
void GetData(DOMElement *root) ;//自定义函数 /*const int MAXN = 2000;
char XMLbuf[MAXN] = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><MSG><META><SNDR>SYSTEM</SNDR><TYPE>ERROR</TYPE><STYP/><DDTM>2015-09-25 14:15:25</DDTM><SEQN/></META><CONTENT><CODE>15</CODE><DESC>error,it is not on the IMF now,please retry login</DESC></CONTENT></MSG>";*/ int main()
{
/*//将字符串写入文件
FILE * fd = fopen("aaa.XML", "w");
fprintf(fd, XMLbuf);
fclose(fd);*/ //初始化环境
try{
XMLPlatformUtils::Initialize();
}
catch (const XMLException& toCatch) {
// Do your failure processing here
return -;
}
//加载分析报文
XercesDOMParser *parser = new XercesDOMParser();
parser->setDoNamespaces(true); // optional parser->setValidationScheme(XercesDOMParser::Val_Always);//设置校验计划
ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();
parser->setErrorHandler(errHandler); //载入XML文件
try {
parser->parse("aaa.XML");
}
catch (const XMLException& toCatch) {
char* message = XMLString::transcode(toCatch.getMessage());
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -;
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -;
}
catch (...) {
cout << "Unexpected Exception \n";
return -;
} //得到文档的树型结构
DOMDocument *doc = parser->getDocument();
DOMElement *root = doc->getDocumentElement();//读取根节点 //遍历所有数据
GetData(root); XMLPlatformUtils::Terminate();//释放环境
getchar();
return ;
} //获取DOM元素数据
void GetData(DOMElement *root) {
while (root != NULL) {
//获取子元素
DOMElement* child = root->getFirstElementChild();
//如果有子元素
if (child != NULL)
//if ((root->hasChildNodes())==true)//使用hasChildNodes()判断是否有子节点会出问题,原因不详.2015-09-28htf
{
//打印当前元素名称
char* name = XMLString::transcode(root->getNodeName());//child->getParentNode()->getNodeName()
printf("getTagName:%s\n", name);
XMLString::release(&name); //获取DOM子元素数据
DOMElement* child = root->getFirstElementChild();
GetData(child);
}
//如果当前元素没有子元素
else {
//打印元素名称和值。
char* name = XMLString::transcode(root->getTagName());//child->getNodeName()
char* textContent = XMLString::transcode(root->getTextContent());
printf("%s:%s\n", name, textContent);
XMLString::release(&name);
XMLString::release(&textContent);
}
//指向下一个同级元素
root = root->getNextElementSibling();
}
}
//-----------------------------------

Xerces-C++: 简史

Xerces-C++ 的前身是 IBM 的 XML4C 项目。XML4C 和 XML4J 是两个并列的项目,而 XML4J 是 Xerces-J——Java 实现——的前身。IBM 将这两个项目的源代码让与 Apache 软件基金会(Apache Software Foundation),他们将其分别改名为 Xerces-C++ 和 Xerces-J。 这两个项目是 Apache XML 组的核心项目(如果看到的是“Xerces-C”而不是“Xerces-C++”,也是同一个东西,因为这个项目一开始就是用 C(译者注:原文为C++)语言编写的)。

引用 :http://www.ibm.com/developerworks/cn/xml/x-xercc/

下载和安装

下载地址 : http://xerces.apache.org/xerces-c/download.cgi

Win32 版本上的编译

主要步骤:

1.VS 2015打开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文件到目标工程下;复制xerces-c-3.1.2下的src文件夹到目标工程下(可以不复制过来,但必须指定对应的路径);

调用动态库的配置

3.右击项目名,属性,配置“C++附加包含目录” 增加\src;配置“linker附加依赖项” 增加“xerces-c_3D.lib”;

参考:http://www.bubuko.com/infodetail-929555.html

包含头文件

#include <xercesc/util/PlatformUtils.hpp>

#include <xercesc/dom/DOM.hpp>

#include <xercesc/sax/HandlerBase.hpp>

#include <xercesc/parsers/XercesDOMParser.hpp>

XERCES_CPP_NAMESPACE_USE 

函数介绍

初始化环境

XMLPlatformUtils::Initialize();

加载分析报文

XercesDOMParser *parser = new XercesDOMParser();

设置校验计划

parser->setDoNamespaces(true);    // optional

parser->setValidationScheme(XercesDOMParser::Val_Always);

ErrorHandler* errHandler = (ErrorHandler*) new HandlerBase();

parser->setErrorHandler(errHandler);

载入XML文件

parser->parse("aaa.XML");

得到文档的树型结构

DOMDocument *doc = parser->getDocument();

DOMElement *root = doc->getDocumentElement();//读取根节点   

获取子元素

  DOMElement* child = root->getFirstElementChild();

获取元素名称和内容

    char* name = XMLString::transcode(root->getTagName());

    char* textContent = XMLString::transcode(root->getTextContent());

获取下一个同级元素

    root = root->getNextElementSibling();

参考文档

官方文档:http://xerces.apache.org/xerces-c/ApacheDOMC++Binding.html

Xerces C++ 学习笔记:http://www.cppblog.com/true/archive/2007/03/15/19900.html?opt=admin

如何在VS2010中使用xerces C++:http://xzhoumin.blog.163.com/blog/static/40881136201342251923494

简单实用的Xml解析类:http://www.vckbase.com/index.php/wv/1459

c++ 使用xerces读取XML:http://www.bubuko.com/infodetail-929555.html

DOM Xerces类库使用方法:http://panpan.blog.51cto.com/489034/187272

——htfei. 2015.09.28

windows下使用xerces -c解析XML的更多相关文章

  1. Windows下错误码全解析

    windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...

  2. Windows下的Crontab表达式解析DLL的使用

    Linux的crontab工具特别的好用,正好现在工作总有好多定时执行的事 用Windows的定时任务觉得特别Low,哈哈,用C#写个任务触发器 然后再用上Crontab表达式解析DLL,觉得马上就高 ...

  3. windows phone中三种解析XML的方法

    需求如下, 项目需要将一段xml字符串中的信息提取出来 <?xml version=""1.0"" encoding=""UTF-8& ...

  4. windows下beautifulsoup使用lxml解析使用报错

    s4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need ...

  5. Myeclipse下不用dom4j等解析xml文档

  6. Java&Xml教程(二)使用DOM方式解析XML文件

    DOM XML 解析方式是最容易理解的,它將XML文件作为Document对象读取到内存中,然后你可以轻松地遍历不同的元素和节点对象.遍历元素和节点不需要按照顺序进行. DOM解析方式适合尺寸较小的X ...

  7. Smarty模板Windows下写代码 放到CentOS6.5无法正确解析

    如题:报错: Unable to load template file 'System/header.htm' in '/var/www/website/cms/Template/Default/We ...

  8. dom4j解析xml中指定元素下内容

    需求:XML为例如以下样式,如今我仅仅想取得timer以下的5000和60000. 解决的方法例如以下: <?xml version="1.0" encoding=" ...

  9. XListview的下拉刷新、上拉加载、用Pull解析XML

    做之前需要导入XListview的文件,此是用第三方的xListview实现的,东西没写全.此是在Fragment中实现的 //--------------XListView的布局---------- ...

随机推荐

  1. elasticsearch添加head插件

    首先,肯定是安装elasticsearch啦,我这里是直接在官网上下载rpm包安装的. 官网:https://www.elastic.co/downloads/elasticsearch elasti ...

  2. there is already 'RtController' bean method 项目报错

    今天开发项目时候发现项目报错启动的时候,也没有具体指的是哪一行报错,其实很简单的知道,首先看下报错信息: there is already 'RtController' bean method pub ...

  3. Jmeter函数作用域实时取值覆盖[针对HTTP Request等控制器]

    jmeter的属性和变量可以简单理解为编程里面的全局变量和局部变量.属性是全局可见,可以跨线程组传递调用,而变量基本上只能存在于一个线程组中(在测试计划定义的变量也是可以跨线程组传递的).同线程组内的 ...

  4. Android SharedPreferences应用实例(记录App的使用次数)

    1.介绍 2.使用方法 3.java后台 package com.lucky.test46sharedpreferences_apply; import android.content.SharedP ...

  5. 江西理工大学南昌校区排名赛 C: 单身狗的地图游戏

    题目描述 萌樱花是一只单身狗. 萌樱花今天决定去喜欢的学妹家玩,但他不记得路,于是他拿出有n个点的完全图,选取了k条不同的路. 完全图:n 个点的图中任意两个点之间都有一条边相连,所以有 n*(n-1 ...

  6. C# 通用区间类

    public class Zone<T> where T : IComparable<T> { /// <summary> /// .ctor /// </s ...

  7. v-model 用在组件中

    官方文档: 使用自定义事件的表单输入组件 官方也说明了,v-model只不过是一个语法糖而已,真正的实现靠的还是 1. v-bind : 绑定响应式数据 2. 触发 input 事件 并传递数据 (核 ...

  8. Java Web编程

    一.二.三有空补 四.  Web应用的安全 1.  CSS攻击,跨站脚本攻击 跨站脚本,顾名思义,就是恶意攻击者利用网站漏洞往Web页面里插入恶意代码,一般需要以下几个 条件: (1)客户端访问的网站 ...

  9. Android 通过网络获取图片的源码

    将开发过程中经常用到的内容做个备份,如下的资料是关于Android 通过网络获取图片的的内容. package com.netimg; import android.app.Activity;impo ...

  10. PIE SDK波段运算

    1.算法功能简介 波段运算(Band Math)工具能够方便的执行图像中的各个波段的加减乘除.三角函数.指数.对数等数学函数计算,也可以使用IDL编写的函数. 由于每个用户都有独特的需求,利用此工具用 ...