Symbian学习笔记(16)
创始人
2024-03-25 10:52:02
0
接上回,这篇介绍那个MContentHandler的实现,这是SAX解析方法的核心所在。

  先看看我要解析的XML文件如下所示,其实很简单,因为它除了Element和Attribute以外没有其它东西了。



















 

  我们的解析处理器的声明如下:

#include
#include

using namespace Xml;

class TNewsChannel
...{
public:
    TInt id;
    HBufC16 * title;
};

class TNewsContent
...{
public:
    TInt id;
    TInt pid;
    HBufC16 * title;
};

class CChannelXmlHandler : public MContentHandler ...{
public:
    // Constructors and destructor
    ~CChannelXmlHandler();
    static CChannelXmlHandler* NewL();
    static CChannelXmlHandler* NewLC();
   
    RArray* GetChannels();
    RArray* GetContents();
    TInt    GetContent(TInt pid,TInt index);
    TInt    ContentCount(TInt pid);

private:

    CChannelXmlHandler();
    void ConstructL();

private: // from MContentHandler

    void OnStartDocumentL( const RDocumentParameters &aDocParam,
        TInt aErrorCode );
   
    void OnEndDocumentL( TInt aErrorCode );
   
    void OnStartElementL( const RTagInfo &aElement,
        const RAttributeArray &aAttributes, TInt aErrorCode );
        
    void OnEndElementL( const RTagInfo &aElement, TInt aErrorCode );
   
    void OnContentL( const TDesC8 &aBytes, TInt aErrorCode );
   
   // ... ...
     
private:
    TInt iCurPID;
    RArray iChannels;
    RArray iContents;
   
};

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

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

  因为我们的XML比较简单,所以在CPP中只要处理OnStartElementL就可以了:

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

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

  于是,这样启动解析过程:
 

    iChannelHandler=CChannelXmlHandler::NewL();
    iXmlParser=CXMLActiveParser::NewL(*this,*iChannelHandler);
    iXmlParser->StartL(KChannelXMLFile);

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

void CChannelXmlHandler::OnStartElementL( const Xml::RTagInfo &aElement,
        const Xml::RAttributeArray &aAttributes, TInt aErrorCode )
...{
    if(aElement.LocalName().DesC().Compare(KChannelName)==0)...{       
        TNewsChannel chn;
        for(TInt i=0;i            if(aAttributes.Attribute().LocalName().DesC().Compare(KTitleName)==0)...{
                chn.title=CnvUtfConverter::ConvertToUnicodeFromUtf8L(aAttributes.Value().DesC());
            }
            else if(aAttributes.Attribute().LocalName().DesC().Compare(KIdName)==0)...{
                TLex8 lex;
                lex.Assign(aAttributes.Value().DesC());
                lex.Val(chn.id);
            }
        }
        iChannels.Append(chn);
        iCurPID=chn.id;
    }
    else if(aElement.LocalName().DesC().Compare(KContentName)==0)...{
        TNewsContent cnt;
        cnt.pid=iCurPID;
        for(TInt i=0;i            if(aAttributes.Attribute().LocalName().DesC().Compare(KIdName)==0)...{
                TLex8 lex;
                lex.Assign(aAttributes.Value().DesC());
                lex.Val(cnt.id);
            }
            else if(aAttributes.Attribute().LocalName().DesC().Compare(KTitleName)==0)...{
                cnt.title=CnvUtfConverter::ConvertToUnicodeFromUtf8L(aAttributes.Value().DesC());
            }
        }
        iContents.Append(cnt);
    }

 

【编辑推荐】

  1. Symbian每6个月发布一款新开源操作系统
  2. 微软建WindowsMarketplace 完善智能机平台
  3. 大力模仿Android 传微软WM6.5可装插件

相关内容

热门资讯

PHP新手之PHP入门 PHP是一种易于学习和使用的服务器端脚本语言。只需要很少的编程知识你就能使用PHP建立一个真正交互的...
网络中立的未来 网络中立性是什... 《牛津词典》中对“网络中立”的解释是“电信运营商应秉持的一种原则,即不考虑来源地提供所有内容和应用的...
各种千兆交换机的数据接口类型详... 千兆交换机有很多值得学习的地方,这里我们主要介绍各种千兆交换机的数据接口类型,作为局域网的主要连接设...
全面诠释网络负载均衡 负载均衡的出现大大缓解了服务器的压力,更是有效的利用了资源,提高了效率。那么我们现在来说一下网络负载...
什么是大数据安全 什么是大数据... 在《为什么需要大数据安全分析》一文中,我们已经阐述了一个重要观点,即:安全要素信息呈现出大数据的特征...
如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
P2P的自白|我不生产内容,我... 现在一提起P2P,人们就会联想到正在被有关部门“围剿”的互联网理财服务。×租宝事件使得劳...
Intel将Moblin社区控... 本周二,非营利机构Linux基金会宣布,他们将担负起Moblin社区的管理工作,而这之前,Mobli...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...