windows下使用xerces -c解析XML
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的更多相关文章
- Windows下错误码全解析
windows系统下,调用函数出错时.可以调用GetLastError函数返回错误码.但是GetLastError函数返回值是DWORD类型,是一个整数.如果想要知道函数调用的真正错误原因,就需要对这 ...
- Windows下的Crontab表达式解析DLL的使用
Linux的crontab工具特别的好用,正好现在工作总有好多定时执行的事 用Windows的定时任务觉得特别Low,哈哈,用C#写个任务触发器 然后再用上Crontab表达式解析DLL,觉得马上就高 ...
- windows phone中三种解析XML的方法
需求如下, 项目需要将一段xml字符串中的信息提取出来 <?xml version=""1.0"" encoding=""UTF-8& ...
- windows下beautifulsoup使用lxml解析使用报错
s4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need ...
- Myeclipse下不用dom4j等解析xml文档
- Java&Xml教程(二)使用DOM方式解析XML文件
DOM XML 解析方式是最容易理解的,它將XML文件作为Document对象读取到内存中,然后你可以轻松地遍历不同的元素和节点对象.遍历元素和节点不需要按照顺序进行. DOM解析方式适合尺寸较小的X ...
- Smarty模板Windows下写代码 放到CentOS6.5无法正确解析
如题:报错: Unable to load template file 'System/header.htm' in '/var/www/website/cms/Template/Default/We ...
- dom4j解析xml中指定元素下内容
需求:XML为例如以下样式,如今我仅仅想取得timer以下的5000和60000. 解决的方法例如以下: <?xml version="1.0" encoding=" ...
- XListview的下拉刷新、上拉加载、用Pull解析XML
做之前需要导入XListview的文件,此是用第三方的xListview实现的,东西没写全.此是在Fragment中实现的 //--------------XListView的布局---------- ...
随机推荐
- springcloud微服务总结 zuul
一 springcloud网关组件理解: 为什么需要网关呢? 我们知道我们要进入一个服务本身,很明显我们没有特别好的办法,直接输入IP地址+端口号,我们知道这样的做法很糟糕的,这样的做法大有问题,首先 ...
- Qt 学习之路 2(60):使用 DOM 处理 XML
Qt 学习之路 2(60):使用 DOM 处理 XML 豆子 2013年8月3日 Qt 学习之路 2 9条评论 DOM 是由 W3C 提出的一种处理 XML 文档的标准接口.Qt 实现了 DO ...
- Android Studio 常用应用
1.在控制台的Logcat中输出测试语句 package com.example.lucky.helloworld; import android.support.v7.app.AppCompatAc ...
- C++_异常8-异常、类和基础
异常.类和继承以三种方式相互关联. 首先,可以像标准C++库所做的那样,从一个异常类派生出另一个. 其次,可以在类定义中嵌套异常类声明来组合异常. 第三,这种嵌套声明本身可以被继承,还可以作为基类. ...
- Moving docker images location to different partition
By default docker will put all the data including images under /var/lib/docker(At least on Debian). ...
- HDU_1846 Brave Game 【巴什博弈】
题目: 十年前读大学的时候,中国每年都要从国外引进一些电影大片,其中有一部电影就叫<勇敢者的游戏>(英文名称:Zathura),一直到现在,我依然对于电影中的部分电脑特技印象深刻. 今天, ...
- 链表 206 Reverse Linked List, 92,86, 328, 2, 445
表不支持随机查找,通常是使用next指针进行操作. 206. 反转链表 /** * Definition for singly-linked list. * struct ListNode { * i ...
- [转] SpringBoot RESTful 应用中的异常处理小结
[From] https://segmentfault.com/a/1190000006749441 SpringBoot RESTful 应用中的异常处理小结 永顺 2016年08月29日发布 赞 ...
- m3m4加载器的优化版m3m4-v1.1
m3m4加载器的优化版m3m4-v1.1 /* //1.以$开头的模块名,表示服务,服务只会执行一次,它可以有自己的方法.比如cookie就是一个服务 //例如:console.log("r ...
- drf序列化器的实例
应用目录结构: views.py from django.shortcuts import render # Create your views here. from django.views imp ...