进入旧版 | 服务项目 | 成功案例 | 联系方式 | 过客留言 | 友情链接
   
设为首页
加入收藏
联系我们
网站首页 | 新闻资讯 | 操作系统 | 办公软件 | 网络软件 | 工具软件 | 媒体动画 | 网页制作 | 网站开发 | 程序开发 | 平面设计
Photoshop视频教程 | Word入门 | Flash入门 | JScript | VBScript | ASP | PHP | ADO | 网页特效 | 3DS MAX6.0命令 | 系统进程
您当前的位置:GOODSGY电脑学习网 -> 网站开发 -> XML/SOAP -> 文章内容  
基于事件解析的SAX模型分析


  SAX2解析器读XML文档,然后产生基于特殊符号的事件。SAX2解析器实际上并不为该文档在内存中创建一棵树结构,它序列的处理一个文档的内容并产生相关的事件。

  比如,当你进行基于事件的编程的时候,你可以创建函数来响应用户定义的事件(比如OnClick事件)。在利用SAX进行编程的时候,需要注意的是,是解析器而不是用户产生事件。

  比如考虑下面一个简单的文档。

  <?XML version="1.0"?>
  <parts>
  <part>TurboWidget</part>
  </parts>

  当SAX2在处理这个文档的时候,它产生如下的一系列的事件:

  StartDocument( )
  StartElement( "parts" )
  StartElement( "part" )
  Characters( "TurboWidget" )
  EndElement( "part" )
  EndElement( "parts" )
  EndDocument( )

  可以把SAX2看成是一个有拉特点(PUSH)的解析器,SAX2产生事件,然后你可以自己去处理些事件。实际上,当SAX2在解析一个文档的时候,SAXXMLReader读该文档并产生一系列的事件,你可以选择一些事件进行处理。


  创建一个应用SAX的应用程序框架

  SAX2产生的事件包括如下的种类:

  ¨ 和XML文档内容相关的事件(ISAXContentHandler)

  ¨ 和DTD相关的事件(ISAXDTDHandler)

  ¨ 出现错误时发生的事件(ISAXErrorHandler)

  为了处理这些事件,你需要实现一个相关的处理类,该处理类需要包含一些方法来处理相关的事件。你必须对你想要处理的事件实现相关的处理。如果你不想处理某一个事件的话,只需要简单的忽略它就可以。在实际应用中,我们首先要继承这些接口,用C++我们可以创建一个类,在这个类的方法中,我们可以告诉应用程序在接收到一个事件的时候如何进行处理。下面是建立一个基于SAX的应用的基本步骤:

  1. 创建头文件当使用SAX2的时候,我们需要用到动态连接库MSXML.DLL,为了使用MSXML中包含的SAX2接口,你必须在程序的头文件(一般在stdafx.h中)中包含下列的代码:

  #import raw_interfaces_only


  using namespace MSXML2;

  2. 建立具体的操作(handler)类,SAX2主要定义了三个基本的操作类,它们分别是ISAXContentHandler,ISAXDTDHandler和ISAXErrorHandler。

  ISAXContentHandler是用来处理SAX2解析器对文档内容进行解析时所产生的消息的,ISAXXMLReader通过方法putContentHandler来注册这个实例。而ISAXDTDHandler是用来处理和DTD相关的基本的消息的,ISAXXMLReader通过方法putDTDHandler来注册这个实例。ISAXErrorHandler提供了对在解析过程中遇到错误时产生的错误事件的处理,ISAXXMLReader通过方法putErrorHandler来注册这个实例

  因为这三个类都是用来对事件进行处理的,并且需要在接口ISAXXMLReader中进行注册。但是它们的基本使用方法类似,所以我们这里只详细描述对接口ISAXContentHandler 的操作。

  ISAXContentHandler接口接收关于文档的内容变化的事件,这是实现SAX应用所需要的最重要的接口,如果应用在遇到基本的解析事件的时候需要被通知的话,ISAXXMLReader通过方法putContentHandler来注册这个实例,然后ISAXXMLReader就使用这个实例来报告基于文档的事件,比如元素的开始,元素的结束和相关的字符串数据等等。ISAXContentHandler 包括了很多的方法:比如startDocument,endDocument,startElement,endElement等等。实际上它包含了好接个startXXX和endXXX对来建立不同的信息集合的抽象。比如startDocument方法在文档信息开始的时候被调用,而在startDocument以后被调用的方法就被认为是文档信息项(item)的子项。在文档信息内容结束的时候endDocument就被调用,表示文档信息的结束。 实际上是SAX2在解析文档的时候,当处于文档某一位置的时候,会激发相应的方法,比如当一个文档开始的时候,就会激发startDocument方法,在实际实现的时候,我们可以在我们继承ISAXContentHandler类的实现类中,重载该方法,实现我们自己想要的处理。我们可以把这些方法看成是ISAXContentHandler接口提供给我们的。需要注意的是事件被处理的顺序和信息在文档中的位置是一致的。

  同时需要注意的是,如果我们需要在我们的应用中对这些消息进行处理的话,我们就要继承处理这些消息的类,比如我们只需要对文档内容进行处理,而忽略对DTD和解析过程中错误(Error)的处理,那么我们只需要创建一个新的类,该类继承ISAXContentHandler接口,因为ISAXContentHandler中定义了很多的事件处理方法,而事实上我们只需要对我们所关心事件的处理方法进行重载,对我们不关心的事件可以简单的忽略它。

  比如我们只关心startElement和endElement事件,而且我们假设我们建立的类的名称为CXMLContentDeal,我们的类就可以如下面所示:

  class CXMLContentDeal : public ISAXContentHandler
   {
    public:
     CXMLContentDeal();
     virtual CXMLContentDeal ();
      virtual HRESULT STDMETHODCALLTYPE startElement(
       /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
       /* [in] */ int cchNamespaceUri,
       /* [in] */ wchar_t __RPC_FAR *pwchLocalName,
       /* [in] */ int cchLocalName,
       /* [in] */ wchar_t __RPC_FAR *pwchRawName,
       /* [in] */ int cchRawName,
       /* [in] */ ISAXAttributes __RPC_FAR *pAttributes);
      virtual HRESULT STDMETHODCALLTYPE endElement(
       /* [in] */ wchar_t __RPC_FAR *pwchNamespaceUri,
       /* [in] */ int cchNamespaceUri,
       /* [in] */ wchar_t __RPC_FAR *pwchLocalName,
       /* [in] */ int cchLocalName,
       /* [in] */ wchar_t __RPC_FAR *pwchRawName,
       /* [in] */ int cchRawName);
    }

  然后我们可以重载方法startElement和endElement来进行和应用相关的特殊的处理。


  3. 通过接口ISAXXMLReader创建一个解析器。XMLReader是SAX应用实现的主要的接口,XMLReader的作用是这样的。首先,XML的开发人员使用这个接口来注册他们对其他SAX接口的实现(比如ContentHandler,DTDHandler,ErrorHandler等等),另外,XMLREADER通过setFeature和setProperty两个方法来配置SAX解析器的行为,最后,XMLReader封装了解析的功能。示例代码如下:

   ISAXXMLReader* pRdr = NULL;
   HRESULT hr = CoCreateInstance(
      __uuidof(SAXXMLReader),
      NULL,
      CLSCTX_ALL,
      __uuidof(ISAXXMLReader),
      (void **)&pRdr);

  4. 创建相应的事件(handler)处理类,这里不妨假设我们只处理和文档内容相关的事件。示例代码如下:

  CXMLContentDeal * pMc = new CXMLContentDeal();

  注意这里CXMLContentDeal是继承接口ISAXContentHandler的类。

  5.在解析器中注册事件处理类,示例代码如下:

   hr = pRdr->putContentHandler(pMc);

  6.开始进行文档的解析,示例代码如下

   hr = pRdr->parseURL(URL); file://这里的URL是指一个具体XML文档的位置

  7.释放解析器对象

   pRdr->Release();

  以上就是基于SAX的应用程序的框架结构,我们可以看到,实际的事件处理是在我们的继承类CXMLContentDeal中实现的,在我们这个示例代码中,每当文档中一个新的元素开始的时候,都会激活方法startElement,每当一个元素结束的时候,都会激活方法endElement。我们可以在startElement和endElement中写入和应用相关的特定的代码。

在百度中搜索:基于事件解析的SAX模型分析
在Google中搜索:基于事件解析的SAX模型分析
在Yahoo中搜索:基于事件解析的SAX模型分析

收藏到网摘:新浪VIVI 365key 我摘 POCO网摘 博采中心 YouNote 和讯网摘 天天收藏
[] [返回上一页] [打 印] [收 藏]

 相关文章    最新文章
· 基于VLAN技术的校园一卡通管理
· 基于Hibernate和Struts的J2EE应用开发
· [图文] Dreamweaver 入门:创建基于表格的页..
· 使用基于Windows Server 2003的计算机创建..
· 配置基于Win 2003 的服务器
· 基于Linux操作系统的目录服务的实现
· 基于Linux操作系统实现的传真系统
· 基于Linux系统核心的汉字显示尝试
· 实现基于Linux操作系统的视频点播系统
· [组图] 搭建基于Linux桌面环境的影音平台
 
· XML和XSLT结合进行网站设计
· 网页教程:XML技巧五则
· XML语法概述
· XML轻松学习手册
· XML 中的常见问题(3)
· XML 中的常见问题(2)
· XML 中的常见问题(1)
· 用XSLT生成网页菜单(2)
· 用XSLT生成网页菜单(1)
· 将改变我们生活的这些XML应用之二

∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
站内搜索

精彩图文
  网站导航  
操作系统 办公软件 网络软件
Vista Windows2003 WindowsXP Windows2000/NT Windows9X/ME Linux 其他 Word Excel Powerpoint Outlook 金山系列 其他 网页浏览 上传下载 联络聊天 邮件工具 服务器软件 网络辅助
工具软件 媒体动画 网页制作
系统工具 媒体工具 压缩工具 图文处理 文件管理 其他 3DMAX Authorware Director Maya 视频处理 其他 Flash Dreamweaver FireWorks FrontPage LiveMotion Golive HTML/CSS 其它
网站开发 平面设计 程序设计
ASP JSP PHP CGI JavaScript VBScript XML/SOAP Web服务器 Photoshop PhotoImpact CorelDraw Illustrator Freehand 设计欣赏 其他 VB VC .NET C/C++ DELPHI JAVA

冀ICP备05019428号
Copyright © 2004-2008 电脑学习网 Inc.All rights reserved.
TEL:13832340607
QQ:39873155
E_Mail:goodsgy(#)hotmail.com   (把(#)替换成@)
MSN:goodsgy(#)hotmail.com   (把(#)替换成@)