频道栏目
首页 > 程序开发 > 综合编程 > 其他综合 > 正文
Xerces C++ SAX解析XML文档
2012-04-14 08:45:00      个评论      
收藏   我要投稿

关于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] #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; 

#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、需要自己实现自己的接口:

[cpp] #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&); 
}; 
#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" ?>

 

摘自 w174504744
点击复制链接 与好友分享!回本站首页
相关TAG标签 C++ 文档
上一篇:关于go语言
下一篇:在.NET中根据SQL Server系统表获取数据库管理信息
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站