windows下使用xerces -c解析XML

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

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

项目示例

功能要求

读取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();

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>

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

编码实现

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

// 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

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

总结

读取XML有两种模式,一种是基于事件的SAX方式,一种是DOM,本文采用DOM方式。

——2015.09.28

时间: 2024-07-31 14:25:52

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

python解析xml并按照其结构输出

平时写代码需要将一个xml文件按照其结构,将每个节点列出来,如: <root> <person age="18"> <name>hzj</name> <sex>man</sex> </person> <person age="19" des="hello"> <name>kiki</name> <sex>female

通过Spring工具类获取classpath下的文件资源,解析xml

File cfgFile = ResourceUtils.getFile("classpath:test.txt"); 或者 org.springframework.core.io.Resource fileRource = new ClassPathResource("test.xml"); 获取文件:fileRource.getFile(); 获取文件流:fileRource.getInputStream(); 获取到xml:进行解析:例:<myXml&g

windows客户端开发--使用tinyxml库解析xml文件

例如,微信windows客户端使用的duilib库中,界面就是用xml进行描述的. 所以,今天我们就来谈一谈windows客户端中,也就是C++中如何解析xml. 很多时候,我们都使用.ini文件来存储一些数据. xml确实是有很多的优点,某种程度上来说也确实可以完全取代ini,但也并非如有些人鼓吹的处处都比ini强. xml,对于描述复杂的数据结构非常的方便,缺点相对ini使用麻烦一点.在表达较短的配置时,没有ini简练.而且因为它有比较严格的格式审查机制,容错性也不是特别好,在手写时容易出现

我也来学着写写WINDOWS服务-解析xml抓取数据并插入数据库

项目告一段落,快到一年时间开发了两个系统,一个客户已经在试用,一个进入客户测试阶段,中间突然被项目经理(更喜欢叫他W工)分派一个每隔两小时用windows服务去抓取客户提供的外网xml,解析该xml,然后将截取的节点字段值插入到已经建好相应结构的表中.并记录日志. xml结构概要如下: <?xml version="1.0" encoding="UTF-8"?> <list> <info> <id>93ef7c7ccc

Android网络下解析XML

XML(Extensible Markup Language)可拓展标记语言,它与HTML一样,都是SGML(标准通用标记语言),它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据.在Android下有三种方式解析XML,分别为SAX.DOM.PULL:它们有各自的特点,在网络编程中会经常使用,根据实际情况选择哪一种解析方式. 1.内存占用 由于Android手机性能相对于PC还是

Go语言配置文件解析器,类似于Windows下的INI文件.

config Package config is a Configuration file parser for INI format 包 config 是一个简洁方的,支持注释的Go语言配置文件解析器,类似于Windows下的INI文件. 配置文件形式为[section] 的段构成, 内部使用 name=value键值对 如果为指定段节点,则默认放入名为[default]的段当中. "#"为注释的开头,可以放置于任意的单独一行中. 安装 go get github.com/lxmgo

Cts框架解析(1)-windows下cts配置

环境搭建 下载 cts工具的下载地址:http://source.android.com/compatibility/downloads.html windows选择Android4.4 R3 Compatibility Test Suite (CTS) - ARM下载. 文件夹结构 解压后的文件夹结构例如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaXRmb290YmFsbA==/font/5a6L5L2T/fontsize/400/fil

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

做之前需要导入XListview的文件,此是用第三方的xListview实现的,东西没写全.此是在Fragment中实现的 //--------------XListView的布局---------------- <me.XListView android:layout_width="fill_parent"        android:layout_height="wrap_content"        android:id="@+id/lv&

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

需求:XML为如下样式,现在我只想取得timer下面的5000和60000. 解决办法如下: <?xml version="1.0" encoding="UTF-8"?> <we> <message id="1001"> <String>Id</String> <String>name</String> <String>sfz</String&g