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以上环境搭建好后,开始编码吧


[cpp]  view plain copy
  1. #include <xercesc/util/PlatformUtils.hpp>  
  2. #include <xercesc/sax2/SAX2XMLReader.hpp>  
  3. #include <xercesc/sax2/DefaultHandler.hpp>  
  4. #include <xercesc/sax2/XMLReaderFactory.hpp>  
  5. #include <xercesc/util/XMLString.hpp>  
  6. #include <iostream>  
  7. #include "MySAX2Handler.h"  
  8. using namespace std;  
  9. using namespace xercesc_3_1;  
  10.   
  11. int main (int argc, char*  args[]) {  
  12.   
  13.     try {  
  14.         XMLPlatformUtils::Initialize();  
  15.     }  
  16.     catch (const XMLException& toCatch) {  
  17.         char* message = XMLString::transcode(toCatch.getMessage());  
  18.         cout << "Error during initialization! :\n";  
  19.         cout << "Exception message is: \n"  
  20.             << message << "\n";  
  21.         XMLString::release(&message);  
  22.         return 1;  
  23.     }  
  24.   
  25.     char* xmlFile = "x1.xml";  
  26.     SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();  
  27.     parser->setFeature(XMLUni::fgSAX2CoreValidation, true);  
  28.     parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional  
  29.     parser->setFeature(XMLUni::fgXercesDynamic, false);  
  30.     parser->setFeature(XMLUni::fgXercesSchema, true);  
  31.     parser->setFeature(XMLUni::fgXercesSchemaFullChecking, true);  
  32.   
  33.     MySAX2Handler* defaultHandler = new MySAX2Handler();  
  34.     parser->setContentHandler(defaultHandler);  
  35.     parser->setErrorHandler(defaultHandler);  
  36.     parser->setEntityResolver(defaultHandler);  
  37.   
  38.     try {  
  39.         parser->parse(xmlFile);  
  40.         }  
  41.     catch (const XMLException& toCatch) {  
  42.         char* message = XMLString::transcode(toCatch.getMessage());  
  43.         cout << "Exception message is: \n"  
  44.             << message << "\n";  
  45.         XMLString::release(&message);  
  46.         return -1;  
  47.     }  
  48.     catch (const SAXParseException& toCatch) {  
  49.         char* message = XMLString::transcode(toCatch.getMessage());  
  50.         cout << "Exception message is: \n"  
  51.             << message << "\n";  
  52.         XMLString::release(&message);  
  53.         return -1;  
  54.     }  
  55.     catch (...) {  
  56.         cout << "Unexpected Exception \n" ;  
  57.         return -1;  
  58.     }  
  59.     defaultHandler->OutputPsList();  
  60.     delete parser;  
  61.     delete defaultHandler;  
  62.     XMLPlatformUtils::Terminate();  
  63.     system("PAUSE");  
  64.     return 0;  
  65. }  

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

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

[cpp]  view plain copy
  1. #pragma once  
  2. #include<xercesc/sax2/DefaultHandler.hpp>  
  3. #include <xercesc/sax2/Attributes.hpp>  
  4. #include "PathsynopsisNode.h"  
  5. using namespace std;  
  6. using namespace xercesc_3_1;  
  7.   
  8.   
  9. class MySAX2Handler :public DefaultHandler  
  10. {  
  11. public:  
  12.     MySAX2Handler(void);  
  13.     ~MySAX2Handler(void);  
  14. public:  
  15.     void startElement(  
  16.         const   XMLCh* const    uri,  
  17.         const   XMLCh* const    localname,  
  18.         const   XMLCh* const    qname,  
  19.         const   Attributes&     attrs  
  20.         );  
  21.     void characters(  
  22.         const   XMLCh* const    chars  
  23.         , const XMLSize_t       length  
  24.         );  
  25.     void endElement(  
  26.         const XMLCh* const uri,  
  27.         const XMLCh* const localname,  
  28.         const XMLCh* const qname  
  29.         );  
  30.     void fatalError(const SAXParseException&);  
  31. };  

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

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


From: http://blog.csdn.net/w174504744/article/details/7456351

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值