`
java-mans
  • 浏览: 11342420 次
文章分类
社区版块
存档分类
最新评论

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" ?>

分享到:
评论

相关推荐

    xerces-c-build.zip

    vs2013使用Xerces C++ SAX解析XML文档,附件为整个vscode的项目,可以根据个人需要,自行编译各个版本

    xerces-c++-3.1.3

    Xerces分析器可处理Java和C++,它采用互联网联盟XML、文件对象模型以及用于XML的简单API标准。所有的Xerces分析器都是模块化可配置的。它为C++版本提供了Perl封装,允许访问Perl的XML分析器,它还提供对统一编码字符...

    xerces src_2_8_0

    C++开源的xml解析器,当前最新的版本xerces-c-src_2_8_0。Xerces-C++ 的前身是 IBM 的 XML4C 项目。XML4C 和 XML4J 是两个并列的...Xerces-C++是一个非常健壮的 XML 解析器,其提供的两种解析XML文档的方法,DOM和SAX。

    xml dom,sax解析,schema验证

    xerces-c++ 2.8应用,主要报错xml文件的解析,创建,修改保存。schema验证的。希望对初学者有所帮助.

    SAX2方法读取XML文件

    SAX2方法读取XML文件,内容非常详实 (read XML file through SAX2 method, and it is in details.)

    MacOS:Xerces

    Xerces-C++ is a validating XML parser written in a portable subset of C++. Xerces-C++ makes it easy to give your application the ability to read and write XML data. A shared library is provided for ...

    d2school-Xerces-C++编译库part01

    Xerces-C++ (通常也称为:Xerces-C)是一套健壮、强大(同时也很庞大)的 XML 解析库,它提供了验证,以及 SAX 和 DOM API。来源:http://www.d2school.com/

    d2school-Xerces-C++编译库part02

    Xerces-C++ (通常也称为:Xerces-C)是一套健壮、强大(同时也很庞大)的 XML 解析库,它提供了验证,以及 SAX 和 DOM API。来源:http://www.d2school.com/

    xerces-c-3.0.0.zip

    Xerces-C++ is a validating XML parser written in a portable subset of C++. Xerces-C++ makes it easy to give your application the ability to read and write XML data. A shared library is provided for ...

    xerces-c-src_2_8_0.tar.gz

    Xerces-C++ 是一个非常健壮的 XML 解析器,它提供了验证,以及 SAX 和 DOM API

    vs2008编译的xerces_c_3_1_1库

    Xerces-C是用可移植的C++子集编写的XML分析器。Xerces-C允许对XML数据进行读写操作。其特征及功能包括:兼容XML 1.0,能记录最近的DOM和SAX规范,可编程产生和验证XML,具有可内插的目录,具有验证和编码器,进行可...

    xerces-c-src-current.zip

    C++版本,解析XML的库,支持DOM和SAX两种形式

    C++开源程序库 C++开源程序库

    其中基于DOM的有TinyXml,基于SAX的当然是Xerces。前者小巧快捷,便于使用,适合做数据交换。后者则是全功能的XML解析器。 7、内存管理:boost::smart_ptr,Hans-Boehm GC C/C++的内存管理是一个永恒的话题。...

    XML DSIG and Encryption (C++)-开源

    一个实现XML DSIG和XML加密标准的C ++库。 基于Apache项目的Xerces(DOM / SAX解析器)和Xalan(XSL / XPATH处理器)库。

    C++标准库介绍.pdf

     Xalan是个用于把XML文档转换为HTML纯文本或者其他XML类型文档XSLT处理器 5、CMarkup 参考网站WebSite:http://www.firstobject.com/xml.htm  这是种使用EDOMXML解析器在很多思路上面非常灵活实用值得大家在DOM和...

Global site tag (gtag.js) - Google Analytics