使用SAX解析XML

原创 2006年05月30日 12:42:00

为什么使用SAX?

因为SAX的效率较高,占用内存小,内存使用量只为一个节点的大小,所以是轻量级XML解析工具。但也由此带来了一些负面的东西,SAX是只向前的和只读的。

在数据的备份和恢复时,如果数据备份为XML形式的话,那么就可以用SAX了,因为DOCUMENT太巨大,如果备份的数据有上G的话,这根本就是不现实的。

SAX的使用

在StdAfx.h中添加:

#import <msxml3.dll> raw_interfaces_only
using namespace MSXML2;

SAX有三个接口,分别为:ISAXContentHandler、ISAXContentHandler和ISAXErrorHandler。其中ISAXContentHandler是和XML文档内容相关事件的处理接口;ISAXContentHandler是和DTD相关事件处理接口;ISAXErrorHandler出现错误时发生事件处理接口。我们根据自己的需要只要继承相应的接口,重载其函数即可。在数据恢复时,我们只对数据感兴趣,所以只要继承ISAXContentHandler即可。

 

    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);
       
    virtual HRESULT STDMETHODCALLTYPE characters(
            /* [in] */ wchar_t __RPC_FAR *pwchChars,
            /* [in] */ int cchChars);

这三个函数是我们需要重载的。注意:在characters函数中,需要将pwchChars中的字符先拷贝到一个临时wchar_t变量中,如果直接拿来使用,数据中可能会带有一些其他杂乱的数据。

char *szValue = new char[cchChars * sizeof(wchar_t) + 1];
  if(!szValue)
   return E_FAIL;

wchar_t *wszValue = new wchar_t[cchChars + 1];
  if(!wszValue)
   return E_FAIL;

  memset(szValue, '/0', (cchChars * sizeof(wchar_t) + 1) * sizeof(char));
  ZeroMemory(wszValue, (cchChars + 1) * sizeof(wchar_t));
  //拷贝目标字符串到临时缓存
  wcsncpy(wszValue, pwchChars, cchChars);

//为支持中文

WideCharToMultiByte(CP_ACP, 0, wszValue, cchChars, szValue, cchChars * sizeof(wchar_t) + 1, NULL, NULL);

if(wszValue)

{

    delete[] wszValue;

    wszValue = NULL;

}

if(szValue)
  {
   delete[] szValue;
   szValue = NULL;
  }

 

使用时很简单,如下:

CoInitialize(NULL);
 ISAXXMLReaderPtr pReader = NULL;
 HRESULT hr = pReader.CreateInstance(__uuidof(SAXXMLReader));
 if(hr != S_OK)
  return -1;

 hr = pReader->putContentHandler(param.pBackUp);//将ISAXContentHandler子类对象跟SAXXMLReader关联
 if(hr != S_OK)
  return -1;

 wchar_t URL[1000];
 ZeroMemory(URL, sizeof(URL));
 mbstowcs(URL, param.szBakFile, strlen(param.szBakFile));
 pReader->parseURL(URL); //文件路径

 Reader->putContentHandler(NULL);

注意:

XML文件中必须只有一个根节点,否则SAX只解析第一个根节点;

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

android使用SAX解析xml

  • 2014-08-24 22:46
  • 10KB
  • 下载

cocos2d-x 3.0 使用Sax解析xml文档(解决中文显示问题)

今天是个好日子,心想的事儿都能成,明天是个好日子,打开了家门儿迎春风。。。 恩,听着歌写文档生活就是这么享受。 今天以前的邻居大神突然在qq上赞了我一下,这让我异常激动啊。。这还要从前前前几天说起,那...

android 使用sax解析XML

  • 2011-07-19 23:31
  • 189KB
  • 下载

Android开发之下载Tomcat服务器的xml文件并使用SAX解析

解析 XML 通常有两种方式,DOM 和 SAX。DOM 虽然是 W3C 的标准,提供了标准的解析方式,但它的解析效率一直不尽如人意,因为使用DOM解析XML时,解析器读入整个文档并构建一个驻留内存的...

安卓中使用SAX解析XML文件样例

在项目开发中我们可能需要读取服务器,并从服务器解析相关数据,而XML文件格式为数据的存储提供了很多方便,因此,掌握XML的解析方式,至少一种解析方式将为网络项目的开发起到如虎添翼的作用。本文采用SAX...

android中使用sax解析xml

/****************************************************/ >sax解析器解析 /**********************************...

使用SAX方式对XML进行解析

SAX  解析特点:对XML文档从上到下,从左到右进行解析   解析步骤:创建工厂->得到解析器->得到处理器->设置内容处理器->读取xml文档内容       处理器中常实现的方法:star...

Android中使用SAX解析XML

SAX是一种以事件驱动的XML API,由它定义的事件流可以指定从解析器传到专门的处理程序的代码的XML结构,简单的说,它解析速度快,占用内存少。这种解析器比较适合android等移动设备。 ...

使用SAX解析XML文件

SAX(Simple API for XML),是指一种接口,或者一个软件包。   DOM:文档驱动。DOM在解析文件之前把整个文档装入内存,处理大型文件时其性能很差,是由于DOM的树结构所造成的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)