`
yesjavame
  • 浏览: 687226 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Symbian学习笔记(16) - 解析XML文件(下)

阅读更多
继续,刚才发表时出错,打开一看是别的人文章了!又白写了,晕……刚才的思路没了,重新来过吧。

书接上回,这篇介绍那个MContentHandler的实现,这是SAX解析方法的核心所在。

先看看我要解析的XML文件如下所示,其实很简单,因为它除了Element和Attribute以外没有其它东西了。
<?xmlversion="1.0"encoding="utf-8"?>
<channels>
<channelid="10"title="时政">
<contentid="1001"title="广东牛奶中毒事件污染源调查结果1周后公布"/>
<contentid="1002"title="河南淅川公安局因儿童被拐案设'局耻日'"/>
<contentid="1003"title="深圳大学135名师生感染病毒引发腹泻"/>
</channel>
<channelid="11"title="国际">
<contentid="1101"title="巴以将于4月7日恢复领导人级和谈"/>
<contentid="1102"title="古巴解除长期禁令允许国民入住涉外酒店"/>
<contentid="1103"title="联合国决定继续对刚果(金)实行武器禁运"/>
<contentid="1104"title="俄拒绝接受美国进攻性战略武器问题建议"/>
</channel>
<channelid="12"title="财经">
<contentid="1201"title="大飞机公司拟定名中国商用飞机有限公司"/>
<contentid="1202"title="大部制新部委定编制方案6月底前上报"/>
</channel>
</channels>

我们的解析处理器的声明如下:
#include<xmlcontenthandler.h>
#include
<xmldocumentparameters.h>

usingnamespaceXml;

classTNewsChannel
...{
public:
TIntid;
HBufC16
*title;
}
;

classTNewsContent
...{
public:
TIntid;
TIntpid;
HBufC16
*title;
}
;

classCChannelXmlHandler:publicMContentHandler...{
public:
//Constructorsanddestructor
~CChannelXmlHandler();
staticCChannelXmlHandler*NewL();
staticCChannelXmlHandler*NewLC();

RArray
<TNewsChannel>*GetChannels();
RArray
<TNewsContent>*GetContents();
TIntGetContent(TIntpid,TIntindex);
TIntContentCount(TIntpid);

private:

CChannelXmlHandler();
voidConstructL();

private://fromMContentHandler

voidOnStartDocumentL(constRDocumentParameters&aDocParam,
TIntaErrorCode);

voidOnEndDocumentL(TIntaErrorCode);

voidOnStartElementL(constRTagInfo&aElement,
constRAttributeArray&aAttributes,TIntaErrorCode);

voidOnEndElementL(constRTagInfo&aElement,TIntaErrorCode);

voidOnContentL(constTDesC8&aBytes,TIntaErrorCode);

//......

private:
TIntiCurPID;
RArray
<TNewsChannel>iChannels;
RArray
<TNewsContent>iContents;

}
;

大多数是MContentHandler所声明的方法,这就是SAX事件解析模式的关键了,我们只需要在这些方法中做相应的处理即可。

除此之外,iChannels和iContents是我们定义了用来保存解析结果的成员,它的类型是RArray,关于RArray可以参考我的别一篇笔记:http://blog.csdn.net/sharetop/archive/2008/03/21/2203450.aspx

因为我们的XML比较简单,所以在CPP中只要处理OnStartElementL就可以了:
voidCChannelXmlHandler::OnStartElementL(constXml::RTagInfo&aElement,
constXml::RAttributeArray&aAttributes,TIntaErrorCode)
...{
if(aElement.LocalName().DesC().Compare(KChannelName)==0)...{
TNewsChannelchn;
for(TInti=0;i<aAttributes.Count();i++)...{
if(aAttributes[i].Attribute().LocalName().DesC().Compare(KTitleName)==0)...{
chn.title
=CnvUtfConverter::ConvertToUnicodeFromUtf8L(aAttributes[i].Value().DesC());
}

elseif(aAttributes[i].Attribute().LocalName().DesC().Compare(KIdName)==0)...{
TLex8lex;
lex.Assign(aAttributes[i].Value().DesC());
lex.Val(chn.id);
}

}

iChannels.Append(chn);
iCurPID
=chn.id;
}

elseif(aElement.LocalName().DesC().Compare(KContentName)==0)...{
TNewsContentcnt;
cnt.pid
=iCurPID;
for(TInti=0;i<aAttributes.Count();i++)...{
if(aAttributes[i].Attribute().LocalName().DesC().Compare(KIdName)==0)...{
TLex8lex;
lex.Assign(aAttributes[i].Value().DesC());
lex.Val(cnt.id);
}

elseif(aAttributes[i].Attribute().LocalName().DesC().Compare(KTitleName)==0)...{
cnt.title
=CnvUtfConverter::ConvertToUnicodeFromUtf8L(aAttributes[i].Value().DesC());
}

}

iContents.Append(cnt);
}

}

这个回调会在解析器遇到元素头时进入,然后我们就可以根据传入的参数取到当前元素的信息,如元素名称、属性值等,将它们保存在我们定义的数据成员中以备将来使用即可。

在使用这个解析器的地方,比如我们的AppView负责解析XML文件,那它应该包含一个MContentHandler的成员,并且它实现接口MXMLHandlerObserver。

于是,这样启动解析过程:
iChannelHandler=CChannelXmlHandler::NewL();
iXmlParser
=CXMLActiveParser::NewL(*this,*iChannelHandler);
iXmlParser
->StartL(KChannelXMLFile);

然后在它的OnParseCompleted方法中去iChannelHandler中取出解析结果,展示出来或者随便怎么用了。


分享到:
评论

相关推荐

    SyExpat--xml解析的开源项目源码(symbian)

    xml解析的开源项目源码(symbian),在S60 2nd和3rd,以及UIQ上编译通过并能在模拟器和真机上正常运行~~ 警告:此项目中的源码部分没问题,只是偶通过源代码编译出的库文件有点问题,建议不要使用\xml_pack目录下...

    SyExpat--xml解析的开源项目源码(symbian)修订版本

    xml解析的开源项目源码(symbian),在S60 2nd和3rd,以及UIQ上编译通过并能在模拟器和真机上正常运行~~ 声明:此项目与本人提交的上个SyExpat项目源代码部分没有变动,区别是通过源码编译生成的SYEXPAT.DLL库做了...

    symbian XML解析 用的是系统的自带XML解析工具

    如果要深入学习和应用Symbian的XML解析,可以通过解压该文件,查看其中的文档或代码示例,了解具体的实现细节和用法。 在实际开发中,理解如何有效地使用Symbian自带的XML解析工具是至关重要的。这不仅涉及到XML...

    Symbian 解析XML

    在深入探讨Symbian系统中解析XML文件的具体方法之前,我们先对Symbian系统以及XML文件的基本概念做一个简要回顾。Symbian是一个广泛应用于早期智能手机的操作系统,它以稳定性和低资源消耗著称。XML(Extensible ...

    Symbian_XML_解析

    本文将深入探讨Symbian环境下XML文件解析的机制、框架以及具体实现方法,帮助开发者更好地理解和应用Symbian XML API。 #### XML解析机制与框架 Symbian系统为XML解析提供了内置支持,主要通过`CParser`类来实现。...

    Xml.rar_symbian x_xml symbi_xml symbian

    本压缩包"Xml.rar_symbian x_xml symbi_xml symbian"包含了一个名为"XmlParser"的文件,可能是一个针对Symbian平台的XML解析器。 XML解析在Symbian系统中的工作原理: 在Symbian平台上,XML解析通常涉及读取XML文档...

    symbian学习笔记(超级经典-适用于初学者)

    本学习笔记旨在为初学者提供全面、细致的Symbian操作系统知识,帮助你快速入门并深入理解其工作原理。 一、Symbian系统概述 Symbian操作系统最初由英国的EPOC公司开发,后被诺基亚收购并成为其主要的操作系统平台。...

    symbian XML解析工具(压缩包)

    总结一下,这个"Symbian XML解析工具(压缩包)"提供了一个名为SyExpat的XML解析库,它是Expat库的Symbian版本,适合用于在Symbian平台上进行XML数据的解析。通过事件驱动的机制,开发者可以高效地处理XML文档中的各种...

    xmlParser library for Symbian S60

    Symbian S60是一个基于塞班系统的智能手机平台,它在早期版本中可能并未提供非常完善的XML解析库。标题提到的“xmlParser library for S60”是一个专为S60平台定制的XML解析库,由C++编写,解决了原生库在处理静态...

    symbian学习笔记,全28讲

    【Symbian学习笔记概述】 Symbian操作系统是一款曾经广泛应用于智能手机的操作系统,尤其在诺基亚手机上占据主导地位。对于想要学习Symbian开发的初学者来说,理解其开发环境的搭建至关重要。本系列笔记共28讲,...

    塞班论坛----塞班证书签名程序

    塞班论坛是一个专门为塞班(Symbian)操作系统用户提供交流平台的社区,其中涉及了大量的技术讨论和资源分享。本文将详细介绍“塞班证书签名程序”的相关知识点,以及如何使用DOSPY签名工具v2.2.9.0627.exe来给SIS或...

    Symbian s60 3rd xml 解析总结

    doc:解析原理和总结 txt:mime类型 zip:HelloXml解析例子(运行环境3rd mr,carbide 1.3/2.0)

    Symbian学习笔记

    这些学习笔记涵盖了Symbian开发的多个关键方面,包括调试、基础概念、应用框架、图形用户界面(GUI)开发、多线程处理、定时器、系统集成以及网络通信。 1. **Debug On Device**: 在设备上进行调试是开发过程中的...

    S60平台的xml解析程序

    使用iksemel解析xml文档,应用于symbian平台上。本程序解压后可直接在模拟器上运行。 iks是Jabber applications的xml解析库,它具有以下特性: 1.基于POSIX和Windows,具有高度的可移植性。 2.适用于嵌入式系统。代码...

    symbianXML解析[汇编].pdf

    通过对Symbian平台XML解析机制的理解,我们可以更加高效地利用Symbian提供的API来处理XML文件。无论是对于移动应用开发还是其他基于Symbian平台的项目来说,掌握这种解析方式都是非常有价值的。此外,通过具体的代码...

    Symbian学习笔记(中国移动开发者社区).pdf

    2. **设置 Carbide.c++**: 安装 Carbide.c++ 并配置其指向 Symbian SDK 的路径,以便 IDE 能够识别 SDK 中的库文件和头文件。 3. **创建项目**: 在 Carbide.c++ 中创建一个新的 Symbian C++ 项目,并设置好项目的...

Global site tag (gtag.js) - Google Analytics