gloox代码分析2 - xml parser模块

gloox库实战指南:深入理解和应用示例 XMPP(Extensible Messaging and Presence Protocol)是一种开放的即时消息协议,最初由Jabber社区开发,现在由XMPP标准基金会维护。其设计目标是提供一个简单、可扩展、分布式的即时消息系统架构,同时支持即时消息、状态指示和群组管理等需求。XMPP协议的一个核心特点是其基于XML的可扩展消息格式,这使得它能够轻松地与其他网络服务进行集成。gloox是一个C++库,它提供了XMPP协议的支持,允许开发者在不深入了解协议细节的情况下实现即时通讯功能。 阅读详情

gloox自己实现了xml的解析模块,没有用到第三方的库(tinyXML,expat )
主要涉及的文件:
tag.h (tag.cpp)
taghandler.h
parser.h (parser.cpp)

1. Tag一个Tag就是一个XML元素
例如:
a.
<book kind='computer'>
<store id='23'/>
<author>
    qiang
</author>
</book>
b. <book id='32'/>
c. <book>name1</book>

首先介绍一个概念: escape-string,何为escape-string?
在escape-string中:
'&'转换成&amp;, '<'转换成&lt;, '>'转换成&gt;.
编码表如下:
//////////////////////////////////////////////////////////////////////////
// 编码表 (中间的空格去掉,这里只是为了方便显示):
// -------------------------------------------------------
// | 字符     | 十进制 | 十六进制 | THML字符集 | Unicode |
// -------------------------------------------------------
// | " 双引号 | & # 34; | & # x22;   | "          | /u0022 |
// -------------------------------------------------------
// | ' 单引号 | & # 39; | & # x27;   | & apos;     | /u0027 |
// -------------------------------------------------------
// | & 与     | & # 38; | & # x26;   | & amp;      | /u0026 |
// -------------------------------------------------------
// | < 小于号 | & # 60; | & # x3C;   | & lt;       | /u003c |
// -------------------------------------------------------
// | > 大于好 | & # 62; | & # x3E;   | & gt;       | /u003e |
// -------------------------------------------------------
gloox - APIs
Tag::escape()    功能: string -> escape-string
Tag::relax() 功能: escape-string -> string

主要成员变量:
attributes - 所有属性的list
name - 节点名字
cdata - 节点数据,例如<name>cdata</name>中的cdata
children - 所有的子节点
parent - 父节点指针,如果没有则为空
bool incoming - 表示构造xml node的时候传入的字符串是否是escape-string,如果是,需要在构造的时候调用relex把escape-string转换成string.

主要方法:
也就是一些针对name/children/attributes/cdata进行增加/删除/修改的方法
xml()方法返回该节点的一个完整的xml数据流
findTag和findTagList提供对XPath的支持.

例如:
屏幕将输出:
<book kind='computer'><store id='23'/><author>qiang</author></book>

1#include <iostream>
2#include "tag.h"
3
4#pragma comment( lib, "gloox.lib"
)
5using namespace
gloox;
6

7//
<book kind='computer'>
8//
    <store id='23'/>
9//
    <author>
10//
      qiang
11//
    </author>
12//
</book>
13
//
14

15
16int main( int argc, char* argv[] )
{
17   Tag* tag_book = new Tag( "book"
);
18   tag_book->addAttribute( "kind", "computer"
);
19
  
20   Tag* tag_store = new Tag( "store"
);
21   tag_store->addAttribute( "id", "32"
);
22

23   Tag* tag_author = new Tag( "author", "qiang"
);
24

25   tag_book->
addChild( tag_store );
26   tag_book->
addChild( tag_author );
27

28   std::cout<<tag_book->xml()<<
std::endl;
29  return 0
;
30}


2. TagHandler是一个接收parser解析完成的tag的接口,继承该类,则可以接收parser解析的tag对象事件.
只有一个接口
virtual void handleTag( Tag *tag ) = 0 - 接收解析完的tag

3. Parser一个XML解析器
提供的接口非常简洁,只需要一个TagHandler来构造,该handler接收并处理解析的tag,另外只有一个feed接口来填充数据.
要注意的是feed接口填充的数据必须是一个格式正确的xml,否则无法解析,也就是说parser不会判断xml的格式。

例如:
下 面的例子中对feed来说分开填充和一次性填充数据的效果是一样的,也就是scenario1和scenario2的效果是一样的,这也刚好和上层应用中 TCP 流处理的方式统一,对于接收到服务器端的XML流,无论是否完整,只需要直接feed就可以了。handlerTag方法将收到两个
xml tag解析完成的事件,分别来自scenario1和scenario2,屏幕将输出:
<book kind='computer'><store id='23'/><author>qiang</author></book>
<book kind='computer'><store id='23'/><author>qiang</author></book>

1#include <iostream>
2#include "tag.h"
3#include "parser.h"
4
5#pragma comment( lib, "gloox.lib"
)
6using namespace
gloox;
7

8//
<book kind='computer'>
9//
    <store id='23'/>
10//
    <author>
11//
      qiang
12//
    </author>
13//
</book>
14//

15//
16

17class TagHandlerImpl : public TagHandler {
18public
:
19    ~TagHandlerImpl() {}

20
21    void run()
{
22       Parser* parser = new Parser(this
);
23      // scenario1

24       std::string data = "<book kind='computer'><store id='23'/><author>qiang</author></book>";
25       parser->
feed( data );
26

27      // scenario2

28       std::string data1 = "<book kind='computer";
29       std::string data2 = "'><store id='23'/><auth"
;
30       std::string data3 = "or>qiang</author></book>"
;
31       parser->
feed( data1 );
32       parser->
feed( data2 );
33       parser->
feed( data3 );
34     }

35
36    void handleTag( Tag *tag )
{
37       std::cout<<tag->xml()<<
std::endl;
38     }

39};
40

41int main( int argc, char* argv[] )
{
42   TagHandlerImpl* taghandlerImpl = new
TagHandlerImpl();
43   taghandlerImpl->
run();
44

45  return 0
;
46}
gloox文件传输代码 关于gloox的文件传输的参考代码,我去掉了一些业务方面的代码,这些代码只能做参考。 立即下载

相关推荐

gloox-0.9.9.12.zip

此工程为c++ vs2017 配置的工程,该工程已配置好,下载直接编译,即可生成动态库DLL,gloox客户端与服务器 进行消息通讯。

gloox消息发送与接受剖析

解析的很好,赞个!原文地址:http://blog.csdn.net/qiuhong101/article/details/3514784 当你连接至服务器之后,你会获得一个客户端实例对象(Client),如果一直要保持连接的话,该实例对象应该一直存在。Client这个对象提供了一个recv()的该方法,通过该方法,就可以接收来自远端的消息了(recv文法默认是阻塞的方式的,如果不需要阻塞,可以通过其参数设置就可以了)。 Gloox在接收远端发来的消息时,会调用一个接口的实现类,该接口为:Message

翻肚鱼儿的博客 403

已经编译成功的gloox0.9.9.7的lib库文件 附带运行库

可以在VS2003下做开发,需要Release编译。附带libeay32.lib、ssleay32.lib和DLL

gloox开发

1、服务器环境 服务器是在xp系统下安装的(我是在虚拟机中的xp系统下安装的),服务器采用的是Openfire 3.9.3版本,安装服务器时采用的是服务器自带的数据库。 2、编程环境 编程环境是在win7 64位系统下进行的,采用的是Microsoft Visual Studio 2010 旗舰版进行编程。 3、客户端编程采用的技术 3.1采用基于C++实现的XMPP协议客户端开源库gloox gloox简介: gloox是一个开源的跨平台的C++实现的XMPP协议开发包,目前的版本为1.0.

翻肚鱼儿的博客 353

gloox配置聊天室

gloox配置聊天室(金庆的专栏)gloox是XMPP协议的C++客户端库。以下代码测试创建多人聊天室(MUC), 并进行配置。参照gloox中的muc示例代码。gloox代码示例中没有聊天室的配置。配置聊天室需要获取配置表单(DataForm), 填好表单然后调用 setRoomConfig().配置表单读取服务器发来的默认配置,仅更改了其中一项。测试服务器使用了ejabberd.const c

金庆的专栏 1747

gloox接收消息

原文链接:http://blog.csdn.net/qiuhong101/article/details/3514784 通过前面的描述,当和服务器建立了连接之后,就可以和服务器进行通讯了,今天先说一下接收远端发送来的文本消息的方式吧。 在接收消息之前,需要明确一件事情,就是一旦你登陆至服务器之后,随时有可能有人人给你发来消息,所以应该考虑的是你需要做一个死循环,不断的监听消息,如

追求无止尽 1578

gloox 接收消息

 (原文出自:http://blog.csdn.net/qiuhong101)通过前面的描述,当和服务器建立了连接之后,就可以和服务器进行通讯了,今天先说一下接收远端发送来的文本消息的方式吧。在接收消息之前,需要明确一件事情,就是一旦你登陆至服务器之后,随时有可能有人人给你发来消息,所以应该考虑的是你需要做一个死循环,不断的监听消息,如果有消息之后,根据消息的不同形式,处理它。当然不用担心

zhangmoon的专栏 1014

gloox连接至openfire

gloox连接至openfire在使用gloox之前,有必要先提一下XMPP协议这个东东。XMPP协议是一个基于互联网的即时通信标准协议。它采用XML技术,以文本的方式传输即时消息。支持动态自定义扩展应用。与传统的网络协议相比,如QQ等,XMPP协议并不是一个基于二进制方式实现的协议,而是基于XML技术的文本方式,也就是说如果不采用加密技术的话,是可以直接查看发送的消息的。

weixin_42769449的博客 237

gloox注册、登录、登出、消息收发的实现(IM客户端)

Gloox的资料实在太少,官方包里有example,但每个用法示例的注释也没有。在反复阅读example下的代码,组合,基本实现了用户的注册、登录、登出 以及 消息的发送与接受。主要参考 register_example.cpp 与 message_example.cpp 封装了一个类Gloox Gloox.h#ifndef GLOOX_H #define GLOOX_H#include "glo

阳光柠檬_的技术笔记 1927

gloox1实现xmpp协议

gloox源代码,可以用来实现xmpp客户端。功能强大

GLOOX1.0官方API文档 chm,DOXYGEN生成。GLOOX开发XMPP必备。

GLOOX1.0官方API文档,DOXYGEN生成。GLOOX开发XMPP必备。 整理后CHM

gloox-0.9.9.12

用vs2010编译好的gloox动态库,可以结合我的博客文章进行C++的即时通信开发

gloox连接至服务器

在使用gloox之前,有必要先提一下XMPP协议这个东东。XMPP协议是一个基于互联网的即时通信标准协议。它采用XML技术,以文本的方式传输即时消息。支持动态自定义扩展应用。与传统的网络协议相比,如QQ等,XMPP协议并不是一个基于二进制方式实现的协议,而是基于XML技术的文本方式,也就是说如果不采用加密技术的话,是可以直接查看发送的消息的。XMPP协议通过定义一些XML的节点关键字,来表明消

qiuhong101的专栏 5881

gloox简单分析

每天进步一点点。 gloox这个库写起来代码还是比较简单,不过网上资料很多。 但通过gloox带的例子写起来还是很简单的。 整体框架 clientBase 里面的recv不断接收消息。然后用Parse不断解析消息,当一个构成一个tag如果注册对应事件就回调对应函数。 虽然上面一句话就说完整个但整个写起来还是非常复杂,可以学习作者各种对象分类。 基本框架全部

XiaoZuoay的专栏 1168

用VC写的一个IM客户端,基于一个开源的gloox库开发

最近在研究jabber,在网上看到了一个开源gloox库,下载地址为http://camaya.net/glooxdownload,觉得还不错,首先它是开源的,并且一直有人在更新,所以我也对它进行了深入的研究.到目前为止开发了几个IM项目,主要实现了文字聊天和文件传输功能.IBB功能,在网上基于gloox的例子可以说是基本上没有,反正我是也有找到过,所以我在学习的过程中写了几个例子,希望对大家有帮

-源码交流区 1838
上一篇: gloox代码分析1 - connect模块
下一篇: gloox代码分析3 - 注册模块
study_live
博客等级 码龄19年 20粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值