Синтаксический анализатор XML SAX с использованием выражений в переполнении стека

    #include <xercesc/sax2/SAX2XMLReader.hpp>
#include <xercesc/sax2/XMLReaderFactory.hpp>
#include <xercesc/sax2/DefaultHandler.hpp>
#include <xercesc/util/XMLString.hpp>
#include <conio.h>
#include <xercesc/parsers/SAXParser.hpp>
#include <xercesc/sax/HandlerBase.hpp>
#include <xercesc/util/XMLString.hpp>
#include <iostream>
#include <xercesc/dom/DOM.hpp>
#include <xercesc/parsers/XercesDOMParser.hpp>
using namespace std;
using namespace xercesc;class ErnstSax2Handler : public DefaultHandler
{
public:
ErnstSax2Handler(void);
virtual ~ErnstSax2Handler(void);

void startElement(
const   XMLCh* const    uri,
const   XMLCh* const    localname,
const   XMLCh* const    qname,
const   Attributes&     attrs
);
void endElement(
const   XMLCh* const    uri,
const   XMLCh* const    localname,
const   XMLCh* const    qname
);
void characters(
const   XMLCh* const    chars,
const   XMLSize_t       length
);

void fatalError(const SAXParseException&);

protected:
// define variables to save the state
};

void ErnstSax2Handler::startElement(const   XMLCh* const    uri,
const   XMLCh* const    localname,
const   XMLCh* const    qname,
const   Attributes&     attrs)
{
char* name = XMLString::transcode(localname);
cout<<name;
// ...
XMLString::release(&name);
}
void ErnstSax2Handler::endElement(
const   XMLCh* const    uri,
const   XMLCh* const    localname,
const   XMLCh* const    qname)
{
char* name = XMLString::transcode(localname);

//...
XMLString::release(&name);
}
void ErnstSax2Handler::fatalError(const SAXParseException& exception)
{
char* message = XMLString::transcode(exception.getMessage());
cout << "Fatal Error: " << message
<< " at line: " << exception.getLineNumber()
<< endl;
XMLString::release(&message);
}
void ErnstSax2Handler::characters(
const   XMLCh* const    chars,
const   XMLSize_t       length
)
{
// This is called when the parser is reading text.
// You will need to save what state you are in via
// startElement / endElement.
}int main () {

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 = "test.xml";
SAX2XMLReader* parser = XMLReaderFactory::createXMLReader();
parser->setFeature(XMLUni::fgSAX2CoreValidation, true);
parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true);   // optional

DefaultHandler* defaultHandler = new DefaultHandler();
xercesc::ContentHandler* h  = new DefaultHandler();

parser->setContentHandler(h);
parser->setErrorHandler(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;
}getch();
delete parser;
delete defaultHandler;
return 0;
}

Когда я запускаю приведенный выше код в Visual Studio 2010, он не выводит на экран названия элементов и их содержимое. Кто-нибудь может мне помочь, как вызвать любой обработчик и как получить контент из элементов (узлов)?
Спасибо заранее.

0

Решение

вы создаете обработчики по умолчанию и передаете их парсеру, а это не то, что вы хотите сделать, как я думаю:

DefaultHandler* defaultHandler = new DefaultHandler();
xercesc::ContentHandler* h  = new DefaultHandler();

parser->setContentHandler(h);
parser->setErrorHandler(defaultHandler);

Вместо этого вам нужно создать свои собственные классы:

DefaultHandler* defaultHandler = new ErnstSax2Handler();
xercesc::ContentHandler* h  = new ErnstSax2Handler();

Надеюсь это поможет.

2

Другие решения

Если кто-то захочет скомпилировать этот код: вы должны удалить объявление конструктора по умолчанию из класса или предоставить реализацию.

например.

public:
//ErnstSax2Handler(void);
//virtual ~ErnstSax2Handler(void);
0

По вопросам рекламы [email protected]