使用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只解析第一个根节点;

使用SAX方式解析XML

一、创建XML文件 目录结构: 二、新建一个带有main方法的类(SAXTest.java)public class SAXTest { public static void main(S...
  • L_in12
  • L_in12
  • 2016年07月13日 14:17
  • 5087

XML解析之SAX解析过程代码详解

上一篇谢了解析原理和过程,这里应用代码直观认识这个原理: 新建Demo1类: import java.io.File; import javax.xml.parsers.SAXParser; ...
  • qq_32059827
  • qq_32059827
  • 2016年05月31日 13:12
  • 1039

QT开发(四十三)——SAX方式解析XML

QT开发(四十三)——SAX方式解析XML一、SAX简介SAX是Simple API for XML的简写,是一种解析XML文件的替代方法,不是由W3C官方所提出的标准,是一种事件驱动的XML API...
  • A642960662
  • A642960662
  • 2017年03月26日 12:47
  • 297

XML解析(一),SAX解析XML

一、概述 SAX,全称Simple API for XML,是一种以事件驱动的XMl API,是XML解析的一种新的替代方法,解析XML常用的还有DOC解析,PULL解析(Android特有),SAX...
  • ydxlt
  • ydxlt
  • 2015年12月05日 09:38
  • 15855

SAX解析XML文档的时候在characters方法中解析有的时候xml文档格式凌乱的时候拿不到数据

首先我们先将xml何为格式好何为格式不好讲清楚 先上格式好的图 在一个就是格式不好的图 我们可以看出来,格式好的与格式不好的之间的差别在于, 不好的多了很多 \n \t 这样的换...
  • u013803262
  • u013803262
  • 2016年07月02日 23:02
  • 1627

XML(SAX)和Json解析分析

XML(SAX)和Json解析分析 一:XML解析步骤 分析:XML解析最终是通过XMLReader的对象来关联一个自己继承自DefaultHandler抽象类(表示一个解析器,它是通过读数据流中对...
  • ZLMLV
  • ZLMLV
  • 2015年09月19日 00:06
  • 289

python3使用sax操作xml

python使用SAX解析xml SAX是一种基于事件驱动的API。 利用SAX解析XML文档牵涉到两个部分:解析器和事件处理器。 解析器负责读取XML文档,并向事件处理器发送事件,如元素开始跟...
  • nuli888
  • nuli888
  • 2016年07月20日 17:56
  • 1522

Python中使用SAX解析XML及实例

在学习廖雪峰老师的Python教程时,学到了难以理解的关于SAX解析XML这一节。本文将从此节出发,逐句的分析此节的作业。其中作业来源于网友评论。 SAX解析XML速度快、占用内存小。我们只需要关注三...
  • wangxingfan316
  • wangxingfan316
  • 2017年08月11日 19:47
  • 939

使用SAX方式解析XML文件

SAX方式解析XML的步骤: 1、通过SAXParseFactory的静态newInstance()方法获取SAXParseFactory实例factory 2、SAXParseFactory实例的n...
  • u014042146
  • u014042146
  • 2015年09月15日 18:16
  • 917

使用SAX解析将xml的文件内容结构保存到java对象中

在Java使用Sax解析xml文件中,我们介绍了如何用SAX解析xml文件,接下来我们继续学习如何将一个xml文件的内容结构保存到一个java实例对象中 一、xml文件如下 计...
  • kingsonyoung
  • kingsonyoung
  • 2016年07月22日 15:17
  • 1485
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用SAX解析XML
举报原因:
原因补充:

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