标签:
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
主要步骤:
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
读取aaa.xml文件,遍历每一个节点,若存在子节点则输出当前结点名称,若不存在子节点则输出当前结点名称和内容(输入与输出见下图)。
#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();
//----------------------------------
<?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>
//----------------------------------
//----------------------------------
// 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 -1;
}
//加载分析报文
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 -2;
}
catch (const DOMException& toCatch) {
char* message = XMLString::transcode(toCatch.msg);
cout << "Exception message is: \n"
<< message << "\n";
XMLString::release(&message);
return -3;
}
catch (...) {
cout << "Unexpected Exception \n";
return -4;
}
//得到文档的树型结构
DOMDocument *doc = parser->getDocument();
DOMElement *root = doc->getDocumentElement();//读取根节点
//遍历所有数据
GetData(root);
XMLPlatformUtils::Terminate();//释放环境
getchar();
return 0;
}
//获取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();
}
}
//-----------------------------------
。。。
http://xerces.apache.org/xerces-c/ApacheDOMC++Binding.html
http://www.cppblog.com/true/archive/2007/03/15/19900.html?opt=admin
http://xzhoumin.blog.163.com/blog/static/40881136201342251923494
http://www.vckbase.com/index.php/wv/1459
http://www.bubuko.com/infodetail-929555.html
读取XML有两种模式,一种是基于事件的SAX方式,一种是DOM,本文采用DOM方式。
——2015.09.28
标签:
原文地址:http://www.cnblogs.com/anwcq/p/xerces-c.html