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. java基础(多态)_03

    一.多态 1.概念:一个对象的多种形态 2.前提: a:必须有继承 b:必须有重写(只有重写才会有意义,没重写语法没错) 3.体现形式: 父类类型 变量名 = new 子类类型(): 4.注意事项: ...

  2. Idea 软件Project项目的jar依赖关系设置方法

    1.查看所依赖的jar文件 (1)File--->Project Structure (2)Modules--->project01---->dependencies,可见所缺少的j ...

  3. 服务端 安装配置 svn

    检查是否安装svn svn --version 看看,既能确定是否安装,又能确定版本多少 安装 svn yum -y install subversion 创建仓库存放目录 mkdir -p /opt ...

  4. Oracle PL/SQL之WITH查询

    [转自] http://blog.csdn.net/t0nsha/article/details/6730855 为什么要用WITH? 1. 如果需要在一段复杂查询里多次应用同一个查询,用WITH可实 ...

  5. n皇后问题--DFS输出棋盘

    N皇后问题 Problem Description 在N*N的方格棋盘放置了N个皇后,使得它们不相互攻击(即任意2个皇后不允许处在同一排,同一列,也不允许处在与棋盘边框成45角的斜线上.你的任务是,对 ...

  6. PIE SDK图层属性

    1. 功能简介 通过查看图层属性可以对图层的基本信息(一般信息,来源,注释,字段信息等)有所了解 ,下面就基于PIE SDK,介绍查看图层属性功能的实现. 2. 功能实现说明 2.1. 实现思路及原理 ...

  7. Ansible 命令相关模块command, shell, raw, expect, script, telnet[转]

    本文主要介绍Ansible的几个命令模块,包括: command - 在远程节点上执行命令 shell - 让远程主机在shell进程下执行命令 script - 将本地script传送到远程主机之后 ...

  8. 重入锁--ReentrantLock

    本部分主要参考<java并发编程艺术>一书相关内容,同时参考https://blog.csdn.net/zhilinboke/article/details/83104597,说的非常形象 ...

  9. Scala安装及开发环境搭建

    最近想学习下scala,为后面转大数据做一些沉淀. 1. 首先保证jdk已经成功安装 2. 去官网下载scala安装程序 http://www.scala-lang.org/download/all. ...

  10. 细说C#中的序列化与反序列化的基本原理和过程

    虽然我们平时都使用第三方库来进行序列化和反序列化,用起来也很方便,但至少得明白序列化与反序列化的基本原理. 懂得人就别看了! 注意:从.NET Framework 2.0 开始,序列化格式化器类Soa ...