關於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" ?>
From: http://blog.csdn.net/w174504744/article/details/7456351