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以上環境搭建好後,開始編碼吧


  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、需要自己實現自己的接口:

  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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章