Xerces C++ SAX解析XML文档

关于SAX的解释,和好处,不做过多的介绍,你完全可以搜索引擎里面找到茫茫多的介绍http://baike.soso.com/v123641.htm?ch=ch.bk.innerlink

本文的主要目的是介绍如何在自己的C++程序中利用Xerces C++ SAX解析XML文档;


1、Xerces C++下载

首先,我们需要去下载Xerces C++:http://xerces.apache.org/xerces-c/download.cgi

以上连接中给出了各种VS版本的Xerces C++的编译文件和源代码,供你下载使用。


2、在工程中引入Xerces C++

1、C/C++ 常规中:附件包含目录:引入include ;头文件

2、链接器常规中:附件包含目录:引入lib;bin;文件

3、链接器输入中:附加依赖项:引入:xerces-c_3.lib xerces-c_static_3.lib


3、OK以上环境搭建好后,开始编码吧


#include <xercesc/util/PlatformUtils.hpp>
#include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/util/XMLString.hpp>
#include <iostream>
#include "MySAX2Handler.h"
using namespace std;
using namespace xercesc_3_1;

int main (int argc, char*  args[]) {

	try {
		XMLPlatformUtils::Initialize();
	}
	catch (const XMLException& toCatch) {
		char* message = XMLString::transcode(toCatch.getMessage());
		cout << "Error during initialization! :\n";
		cout << "Exception message is: \n"
			<< message << "\n";
		XMLString::release(&message);
		return 1;
	}

	char* xmlFile = "x1.xml";
	SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
	parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
	parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional
	parser->setFeature(XMLUni::fgXercesDynamic, false);
	parser->setFeature(XMLUni::fgXercesSchema, true);
	parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);

	MySAX2Handler* defaultHandler = new MySAX2Handler();
	parser->setContentHandler(defaultHandler);
	parser->setErrorHandler(defaultHandler);
	parser->setEntityResolver(defaultHandler);

	try {
		parser->parse(xmlFile);
		}
	catch (const XMLException& toCatch) {
		char* message = XMLString::transcode(toCatch.getMessage());
		cout << "Exception message is: \n"
			<< message << "\n";
		XMLString::release(&message);
		return -1;
	}
	catch (const SAXParseException& toCatch) {
		char* message = XMLString::transcode(toCatch.getMessage());
		cout << "Exception message is: \n"
			<< message << "\n";
		XMLString::release(&message);
		return -1;
	}
	catch (...) {
		cout << "Unexpected Exception \n" ;
		return -1;
	}
	defaultHandler->OutputPsList();
	delete parser;
	delete defaultHandler;
	XMLPlatformUtils::Terminate();
	system("PAUSE");
	return 0;
}

main()函数的声明:其中包括SAX解析器的声明。

4、需要自己实现自己的接口:

#pragma once
#include<xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/sax2/Attributes.hpp>
#include "PathsynopsisNode.h"
using namespace std;
using namespace xercesc_3_1;


class MySAX2Handler :public DefaultHandler
{
public:
	MySAX2Handler(void);
	~MySAX2Handler(void);
public:
	void startElement(
		const   XMLCh* const    uri,
		const   XMLCh* const    localname,
		const   XMLCh* const    qname,
		const   Attributes&     attrs
		);
	void characters(
		const   XMLCh* const    chars
		, const XMLSize_t       length
		);
	void endElement(
		const XMLCh* const uri,
		const XMLCh* const localname,
		const XMLCh* const qname
		);
	void fatalError(const SAXParseException&);
};

5、对于SAX解析XML数据中存在中文的情况,SAX会直接进入到 fatalError事件中,导致解析错误的问题。

需要我们在XML文档的开头添加文档编码方式:<?xml version="1.0" encoding="gb2312" ?>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值