# HG changeset patch # User František Kučera # Date 1547165620 -3600 # Node ID 4b566dee1a573ece2d6da37d182912bde6155366 # Parent 3ab78bf63467b887f4c7d224614fd1f7dcc6d922 generate random relation on SAX events diff -r 3ab78bf63467 -r 4b566dee1a57 src/XMLCommand.h --- a/src/XMLCommand.h Fri Jan 11 00:29:32 2019 +0100 +++ b/src/XMLCommand.h Fri Jan 11 01:13:40 2019 +0100 @@ -36,42 +36,66 @@ namespace in { namespace xml { +using namespace relpipe::writer; +using namespace xercesc; + class XMLCommand { +private: + + class RelpipeSaxHandler : public xercesc::DefaultHandler { + private: + unique_ptr writer; + + public: + + RelpipeSaxHandler(std::ostream& output) : DefaultHandler(), writer(Factory::create(output)) { + } + + void startElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname, const Attributes& attrs) override { + //XMLString:: + // TODO: remove demo + writer->startRelation(L"xml_startElement",{ + {L"s", TypeId::STRING}, + }, true); + + writer->writeAttribute(L"a"); + } + + void endElement(const XMLCh * const uri, const XMLCh * const localname, const XMLCh * const qname) override { + // TODO: remove demo + writer->startRelation(L"xml_endElement",{ + {L"s", TypeId::STRING}, + }, true); + + writer->writeAttribute(L"a"); + } + + void endDocument() override { + // TODO: remove demo + writer->startRelation(L"xml_endDocument",{ + {L"s", TypeId::STRING}, + }, true); + + writer->writeAttribute(L"a"); + } + + }; + public: void process(std::istream& input, std::ostream& output) { - using namespace relpipe::writer; - using namespace xercesc; - unique_ptr writer(Factory::create(output)); XMLPlatformUtils::Initialize(); - - unique_ptr parser(XMLReaderFactory::createXMLReader()); parser->setFeature(XMLUni::fgSAX2CoreValidation, true); parser->setFeature(XMLUni::fgSAX2CoreNameSpaces, true); - // TODO: custom handler that reads - DefaultHandler defaultHandler; - parser->setContentHandler(&defaultHandler); - parser->setErrorHandler(&defaultHandler); + RelpipeSaxHandler saxHandler(output); + parser->setContentHandler(&saxHandler); + parser->setErrorHandler(&saxHandler); StreamInputSource inputSource(input); parser->parse(inputSource); - - - // TODO: remove demo - // Various data types passed as strings - writer->startRelation(L"xml",{ - {L"s", TypeId::STRING}, - {L"i", TypeId::INTEGER}, - {L"b", TypeId::BOOLEAN} - }, true); - - writer->writeAttribute(L"a"); - writer->writeAttribute(L"1"); - writer->writeAttribute(L"true"); - } };